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