使用XML Schema保证未知深度的子元素

时间:2013-03-07 00:50:13

标签: xml xsd

我有一个XML模式,我知道元素必须有一个特定的子元素,但我不知道该子元素的存在深度。采用以下示例XML:

<node id="top">
   <node id="inner">
     <event/>
   </node>
</node>

<node id="top">
   <event/>
</node>

我唯一的要求是<event>元素必须是<node id="top">元素的后代,但我不知道它将在何种深度发生。换句话说,在顶部<node id="inner"><node id="top">元素之间可能有任意数量的<event>个元素。在上面的示例中,每个都在架构中有效。我的尝试解决方案是:

<xs:element name="node">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="node" minOccurs="0">
                <xs:complexType>
                     <xs:sequence>
                        <xs:element name="event"/>
                     </xs:sequence>
                   <xs:attribute name="id" fixed="inner"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
      </xs:complexType>
      <xs:attribute name="id" fixed="top"/>
</xs:element>

但是,正如预期的那样,这并未考虑<node>元素之后可能出现的<node id="top">元素的许多“深度”。

1 个答案:

答案 0 :(得分:1)

这是answered!尝试类似下面的内容

<?xml version="1.0"?> 
<xs:schema targetNamespace="http://test"
  elementFormDefault="qualified" attributeFormDefault="unqualified"
  xmlns:test="http://test"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="nodes">   
      <xs:complexType> 
           <xs:sequence minOccurs="0" maxOccurs="unbounded">
                   <xs:element name="node"  type="test:nodeType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
 </xs:complexType> 
  </xs:element>

<xs:complexType name="nodeType">  
                <xs:sequence minOccurs="0" maxOccurs="unbounded">
                           <xs:element name="event" minOccurs="0"/>
                           <xs:element name="node" type="test:nodeType" minOccurs="0">

</xs:schema>