2013-03-07 80 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>