当节点有多个子节点时,针对XSD的XML验证失败

时间:2011-03-08 18:16:08

标签: xml validation xsd xml-validation

我需要为系统之间使用的XML文件生成XSD,以便我们验证所获得的数据是否有效。

XML看起来像这样(但有更多字段):

<Request>
<Request_ID>1000012295</Request_ID>
<Extra_Info>
  <Item>
    <Item_Number>0000000001</Item_Number>
    <ItemDescription>test- 2</ItemDescription>    
  </Item>
  <Item>
    <Item_Number>0000000002</Item_Number>
    <ItemDescription>test - 2</ItemDescription>
  </Item>
</Extra_Info>
</Request>

我的XSD如下:

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Request">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Request_ID" type="xsd:int" />
        <xsd:element name="Extra_Info">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Item">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Item_Number" type="xsd:int" />
                    <xsd:element name="ItemDescription" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

当我只有一个Item节点时,此架构有效,但只要我有多个节点,我就会收到以下错误:

元素'Extra_Info'具有无效的子元素'Item'。

如果将其指定为序列,为什么它不起作用?

谢谢!

PS:我使用This Online Validator进行快速验证,但我也遇到了与XMLReader相同的错误

2 个答案:

答案 0 :(得分:3)

默认情况下,即使在序列

中定义,元素的最小值和最大值也会设置为1

您的Extra_Info元素定义应如下所示:

<xsd:element name="Extra_Info">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="Item" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Item_Number" type="xsd:int" />
            <xsd:element name="ItemDescription" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

注意:声明您可以拥有一个或多个这些元素的无界属性。

要拥有任意数量的项目,您可以将minOccurs ='0'添加到item元素中,使其如下所示:

<xsd:element name="Item" maxOccurs="unbounded" minOccurs="0">

答案 1 :(得分:2)

您必须将属性maxOccurs="unbounded"添加到xsd文件中的元素Item