xsd架构验证

时间:2009-02-11 15:04:34

标签: xml validation xsd schema

我遇到了xsd架构的问题。我定义了以下架构:

<xs:element name="nodes" type="nodesRootType" />

<xs:complexType name="nodesRootType">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element name="node" type="nodeType" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="nodeType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="node" type="nodeType" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>

我正在按照xml:

进行测试
<label name="Label_6" >
    <label name="Label_7" />
</label>
<label name="Label_8" />

我得到的错误是:

cvc-complex-type.2.4.a: Invalid content 
    was found starting with element 'node'. One of '{node}' is expected.

我在这里错过了什么。任何帮助都是值得欣赏的。

最佳, 约瑟夫

1 个答案:

答案 0 :(得分:3)

您要验证的单个XML文档不能有多个根。它必须有一个根。你的XML:

<label name="Label_6">
    <label name="Label_7"/>
</label>
<label name="Label_8"/>

有两个根,因为根级别有两个“label”元素。此外,您的架构没有定义任何名为“label”的元素,所以我很困惑。您可能需要一个可以验证类似以下XML的模式:

<labels>
    <label name="Label_6">
        <label name="Label_7"/>
    </label>
    <label name="Label_8"/>
</labels>

这里你有一个根“labels”。请注意,您在层次结构中的不同级别具有相同名称的元素“label”。这不是verboten(例如,参见xhtml,你可以在div里面有一个div ......)但这可能令人困惑。对于上面显示的示例XML,请尝试类似以下的模式:

<xs:element name="labels">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="label" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="labelType">
  <xs:sequence>
    <xs:element ref="label" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

<xs:element name="label" type="labelType"/>