递归xml架构生成

时间:2017-07-05 17:17:16

标签: xml recursion xsd xsd-validation

我有一个带有递归元素的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编写一个更短的递归模式?

enter image description here

2 个答案:

答案 0 :(得分:2)

在你的情况下,除了序列中的最后一个元素F之外的每个元素都包含B元素,我可以提供以下模式的tge。 通过使用选择构造,可以使最后的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> 

答案 1 :(得分:0)

当然可以编写递归模式。对于任何实例文档,可以使用任意数量的模式来准确描述它,但自动模式生成器的难点在于发现优雅地描述它的模式:即猜测其他实例您可能希望架构也接受的文档。

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

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

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