递归 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>
我有一个带有递归元素的 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>