如何避免在XML模式中使用全局元素

时间:2011-09-02 12:54:05

标签: xml xsd

我想创建一个只允许一个根节点的xml架构。

在根节点下面的结构中,有一个我想在不同位置重用的元素。

我的第一种方法是在模式中创建一个全局元素,但是如果我这样做,只有一个标记为root的xml文档对这个模式也有效。

如何创建仅允许在我的根结构中用作ref元素的全局元素?

这就是我想要的:

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

但这也是有效的 <leaf/>作为根节点

1 个答案:

答案 0 :(得分: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>

我希望它可以帮到你。