XSD嵌套元素递归

时间:2015-03-26 09:40:07

标签: xml recursion xsd

我是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模式来指定在标记中允许设置实际值(String类型)或嵌套XML本身。因此,我希望有键值对或key-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>

1 个答案:

答案 0 :(得分:1)

你的架构对我来说很好;它应该适合你想做的事情。

作为一种精确度,在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:assert>中添加<xs:complexType>条件。

只是一句小话:为了避免在任何地方重复xmlns:odm="http://www.r-style.com/2014/odm-model",只需在<xs:schema>根声明上设置名称空间声明:

<xs:schema xmlns:odm="http://www.r-style.com/2014/odm-model"