递归 xml 架构生成

recursive xml schema generation

我有一个带有递归元素的 xml,如下例所示。 A 包含一系列 B 元素。每个 B 元素包含一个 C、D、E 和 F 元素。序列中除最后一个外的每个 F 都包含一个 B 元素。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A>
  <B>
    <C></C>
    <D></D>
    <E></E>
          <F>
            <B> 
              <C></C>
              <D></D>
              <E></E>
                    <F>  
                      <B> 
                        <C></C>
                        <D></D>
                        <E></E>
                        <F></F>
                      </B>
                    </F>
           </B>
        </F>
   </B>
</A>

当我使用在线生成器为此 xml 生成架构时,我得到了一个非常长的架构文件。有没有办法为此写一个更短的递归模式xml?

当然可以写一个递归的schema。对于任何实例文档,都可以使用任意数量的模式来准确地描述它,但是自动模式生成器的困难在于找到优雅地描述它的模式:也就是说,猜测您可能想要的其他实例文档模式也接受。

编写递归模式的典型方法是使用命名的全局类型(尽管也可以使用命名的全局元素声明来完成)。类似于:

<xs:element name="A" type="A-type"/>

<xs:complexType name="A-type">
  <xs:sequence>
    <xs:element ref="A" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

在您的情况下,序列中除最后一个元素外的每个元素 F 都包含 B 元素,我可以提供以下架构。 通过使用选择构造,可以使最后一个 F 元素不递归。 此架构验证正确,但我不确定它是否是一个优雅的解决方案。

<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="A">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="B" type="B" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="F" type="B"/>
  <xsd:complexType name="B">
    <xsd:sequence>
      <xsd:element name="C" type="xsd:string" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="D" type="xsd:string" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="E" type="xsd:string" minOccurs="0" maxOccurs="1"/>
      <xsd:choice>
        <xsd:element ref="F" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="F" type="xsd:string" minOccurs="0" maxOccurs="1"/>
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>