如何在xml中的complextype下确保一些强制性和一些可选元素?

时间:2012-06-11 06:25:18

标签: xml xsd

我在制作复杂元素方面遇到了问题,它既包含可选元素,也包含必需元素。 对于下面的xml,假设h2是必需的,而h1是可选的,顺序无关紧要。

案例1:

<root>
<h1/>
<h2/>
</root>

案例2:

<root>
<h2/>
</root>

案例3:

<root>
<h2/>
<h1/>
</root>

XSD:

<xs:element name="root">
    <xs:complexType>
           <xs:sequence minOccurs="1" maxOccurs="unbounded">
               <xs:element name="h1" minOccurs="0"></xs:element>
                <xs:element name="h2" minOccurs="1" />
           </xs:sequence>
     </xs:complexType>
</xs:element>

上述第三种情况在此xsd中失败,但这种情况有效。 我需要一个对所有上述情况都有效的xsd。

1 个答案:

答案 0 :(得分:0)

知道你想要的是:

  

使h2发生在最近1,而h1可以发生多次   可能的

如果XML的内容类似于(RegExpr)<root><h1/>*<h2/><h1/>*</root>,则可以使用此XSD定义XML有效。

XSD:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence minOccurs="1" maxOccurs="1">
        <xsd:element name="h1" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="h2" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="h1" minOccurs="0" maxOccurs="unbounded"/>        
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<小时/> 有效的XML示例:
1)

<root>
  <h1/>
  <h1/>
  <h2/>
  <h1/>
</root>

2)

<root>
  <h1/>
  <h2/>
</root>

<小时/> 无效的XML示例:
两个<h2/>元素。

<root>
  <h2/>
  <h1/>
  <h2/>
</root>

<h2/>元素。

<root>
  <h1/>
  <h1/>
</root>