2011-09-02 77 views
2

我想創建一個只允許一個單一根節點的xml模式。如何避免在XML模式中使用全局元素

在根節點下面的結構中,有一個要在不同位置重用的元素。

我的第一種方法是在模式中創建一個全局元素,但是如果我這樣做了,只有一個標記爲根的xml文檔對這個模式也是有效的。

如何創建僅允許用作我的根結構內的ref-element的全局元素?

這就是我想有:

<root> 
    <branch> 
    <leaf/> 
    </branch> 
    <branch> 
    <fork> 
     <branch> 
      <leaf/> 
     </branch> 
     </leaf> 
    </fork> 
</root> 

但是,這也將是有效的 <leaf/>作爲根節點

回答

0

XML始終只有一個根節點。它代表了一種等級結構,並且與其模式綁定在一起。所以你不能改變具有相同模式和有效的根元素。

首先,應充分形成這樣的:

<?xml version="1.0" encoding="UTF-8"?> 

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="your-scheme.xsd> 
    <branch> 
     <leaf/> 
    </branch> 
    <branch> 
     <fork> 
      <branch> 
       <leaf/> 
      </branch> 
      <leaf/> 
     </fork> 
    </branch> 
</root> 

我建議的方案是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="root"> 
     <xs:sequence> 
      <xs:element ref="branch" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="branch"> 
     <xs:choice> 
      <xs:element ref="fork" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element ref="leaf" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:choice> 
    </xs:complexType> 
    <xs:complexType name="fork"> 
     <xs:sequence> 
      <xs:element ref="branch" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element ref="leaf" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="leaf"/> 
    <xs:element name="root" type="root"/> 
    <xs:element name="branch" type="branch"/> 
    <xs:element name="fork" type="fork"/> 
    <xs:element name="leaf" type="leaf"/> 
</xs:schema> 

我希望它可以幫助你。

+0

好吧,但是什麼阻止我只使用葉標記作爲XML數據的單個內容? – martin