2013-03-07 37 views
1

我有一個XML模式,我知道元素必須有特定的子元素,但我不知道該子元素的深度。看看下面的例子XML:使用XML Schema保證未知深度的子元素

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

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

唯一的要求我是一個<event>元素必須是<node id="top">元素的後代,但我不知道會發生什麼深度它。換句話說,在頂部<node id="top"><event>元素之間可以有任何數量的<node id="inner">元素。在上面的例子中,每個在模式中都是有效的。我嘗試的解決方案是:

<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 id="top">元素之後可能發生的<node>元素的「深度」。

+0

看起來像這樣大多是重複的。這個問題的簡單答案是你必須指定maxOccurs =「unbounded」來獲得未知的遞歸深度。 – smaccoun 2013-03-08 21:55:44

回答

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>