XSD 嵌套元素递归
XSD nested element recursion
我是 XSD 的新手,所以我的问题可能看起来很明显,但是,无论如何...
考虑我有以下 XML:
<om:model xmlns:om="http://www.r-style.com/2014/odm-model">
<om:entry>
<om:key>KEY1</om:key>
<om:value>VALUE1</om:value>
</om:entry>
<om:entry>
<om:key>KEY2</om:key>
<om:value>VALUE2</om:value>
</om:entry>
<om:entry>
<om:key>KEY3<om:key>
<om:value>
<om:model>
<om:entry>
<om:key>KEY4</om:key>
<om:value>VALUE4</om:value>
</om:entry>
<om:entry>
<om:key>KEY5</om:key>
<om:value>VALU5E</om:value>
</om:entry>
</om:model>
</om:value>
</om:entry>
</om:model>
有没有一种方法可以创建这样的 XSD 模式来指定在标记中允许设置实际值(字符串类型)或嵌套 XML 本身。因此,我想要键值对或键-xml 对,并且 xml 还应该包含键值对或键-xml 对之类的东西。等等...
感谢您的宝贵时间!
P.S.: 目前我尝试使用以下 XSDSchema 但仍然必须确定它是否正确或现在:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.r-style.com/2014/odm-model">
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" name="model" type="odm:modelType"/>
<xs:complexType name="entryType">
<xs:sequence>
<xs:element type="xs:string" name="key"/>
<xs:element name="value">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="modelType">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:entryType" name="entry" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="valueType">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
你的模式对我来说很好;它应该能很好地满足您的需求。
准确地说,在 XML 中不可能 独占地 设置文本或某些标签等内容模型。您需要使用混合内容模型,并且始终可以插入一些文本,即使插入了 <om:model>
。
为避免这种情况,您可以将 <om:value>
的文本内容包裹在标签中,例如<om:str>
,并在模式定义中使用 <xs:choice>
,产生类似的东西:
<xs:element name="value">
<xs:complexType>
<xs:choice>
<xs:element name="model"/>
<xs:element name="str" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
其他可能性:使用架构 1.1.,您可以在 <xs:complexType>
.
中添加 <xs:assert>
条件
只是一个小提示:为了避免到处重复 xmlns:odm="http://www.r-style.com/2014/odm-model"
,只需在 <xs:schema>
根声明上设置命名空间声明:
<xs:schema xmlns:odm="http://www.r-style.com/2014/odm-model"
我是 XSD 的新手,所以我的问题可能看起来很明显,但是,无论如何...
考虑我有以下 XML:
<om:model xmlns:om="http://www.r-style.com/2014/odm-model">
<om:entry>
<om:key>KEY1</om:key>
<om:value>VALUE1</om:value>
</om:entry>
<om:entry>
<om:key>KEY2</om:key>
<om:value>VALUE2</om:value>
</om:entry>
<om:entry>
<om:key>KEY3<om:key>
<om:value>
<om:model>
<om:entry>
<om:key>KEY4</om:key>
<om:value>VALUE4</om:value>
</om:entry>
<om:entry>
<om:key>KEY5</om:key>
<om:value>VALU5E</om:value>
</om:entry>
</om:model>
</om:value>
</om:entry>
</om:model>
有没有一种方法可以创建这样的 XSD 模式来指定在标记中允许设置实际值(字符串类型)或嵌套 XML 本身。因此,我想要键值对或键-xml 对,并且 xml 还应该包含键值对或键-xml 对之类的东西。等等...
感谢您的宝贵时间!
P.S.: 目前我尝试使用以下 XSDSchema 但仍然必须确定它是否正确或现在:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.r-style.com/2014/odm-model">
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" name="model" type="odm:modelType"/>
<xs:complexType name="entryType">
<xs:sequence>
<xs:element type="xs:string" name="key"/>
<xs:element name="value">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="modelType">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:entryType" name="entry" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="valueType">
<xs:sequence>
<xs:element xmlns:odm="http://www.r-style.com/2014/odm-model" type="odm:modelType" name="model" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
你的模式对我来说很好;它应该能很好地满足您的需求。
准确地说,在 XML 中不可能 独占地 设置文本或某些标签等内容模型。您需要使用混合内容模型,并且始终可以插入一些文本,即使插入了 <om:model>
。
为避免这种情况,您可以将 <om:value>
的文本内容包裹在标签中,例如<om:str>
,并在模式定义中使用 <xs:choice>
,产生类似的东西:
<xs:element name="value">
<xs:complexType>
<xs:choice>
<xs:element name="model"/>
<xs:element name="str" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
其他可能性:使用架构 1.1.,您可以在 <xs:complexType>
.
<xs:assert>
条件
只是一个小提示:为了避免到处重复 xmlns:odm="http://www.r-style.com/2014/odm-model"
,只需在 <xs:schema>
根声明上设置命名空间声明:
<xs:schema xmlns:odm="http://www.r-style.com/2014/odm-model"