【问题标题】:XML validation against XSD failing when node has multiple children当节点有多个子节点时,针对 XSD 的 XML 验证失败
【发布时间】:2023-03-21 08:21:01
【问题描述】:

我需要为我们要在系统之间使用的 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 时也遇到同样的错误

【问题讨论】:

    标签: xml validation xsd xml-validation


    【解决方案1】:

    默认情况下,一个元素的最小值和最大值设置为 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>
    

    注意:unbounded 属性表明您可以拥有 1 个或多个这些元素。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!我看到了 minOccur 和 maxOccur 属性,但认为它们只是用于启用约束,而不是解除它们
      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2012-09-20
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多