“此元素不是预期的”错误:xs:sequence与xs:all

时间:2015-07-10 19:41:55

标签: xml xsd xsd-validation

我有一些XML我正在编写验证工具,因此我们的客户可以测试他们的示例源,但我对XSD很新。基于cookie切割器示例,我已经达到了一切正确验证的程度,所以我想在其中抛出一些其他场景。我想出的第一个是在基节点中有不同的元素顺序。

实施例: 我使用以下complexType来验证每个事务节点

C(x,y,z) == C(y,z,x) == C(z,x,y)

以下示例节点的顺序正确,因此可以正确验证

<xs:complexType name="transactionType">
    <xs:sequence>
        <xs:element type="xs:string" name="id"/>
        <xs:element type="xs:string" name="type"/>
        <xs:element type="xs:float" name="amount"/>
        <xs:element type="xs:string" name="description"/>
        <xs:element type="xs:string" name="status"/>
        <xs:choice>
            <xs:element name="transacted_on" type="xs:date"/>
            <xs:element name="transacted_at" type="xs:date"/>
        </xs:choice>
        <xs:choice>
            <xs:element name="posted_on" type="xs:date"/>
            <xs:element name="posted_at" type="xs:date"/>
        </xs:choice>
    </xs:sequence>
</xs:complexType>

但我希望能够以任何顺序拥有元素。因此,以下内容将正确验证。我们的想法是所有元素都存在,并且可以按任何顺序排列。

<transaction>
    <id>20150617-123456</id>
    <type>DEBIT</type>
    <amount>17.44</amount>
    <description>Debit Card: CAFE  06/16/15</description>
    <status>POSTED</status>
    <transacted_on>2015-06-17</transacted_on>
    <posted_on>2015-06-16</posted_on>
</transaction>

我做了一些研究,并很快指出使用<transactions> <transaction> <amount>17.44</amount> <id>20150617-123456</id> <type>DEBIT</type> <description>Debit Card: CAFE 06/16/15</description> <status>POSTED</status> <transacted_on>2015-06-17</transacted_on> <posted_on>2015-06-16</posted_on> </transaction> <transaction> <id>20150617-123456</id> <type>CREDIT</type> <amount>17.44</amount> <description>VISA Card: payment</description> <status>POSTED</status> <transacted_on>2015-06-17</transacted_on> <posted_on>2015-06-16</posted_on> </transaction> </transactions> 元素,它应该完全符合我的要求。因此,我将架构更改为使用xs:all而不是xs:all

xs:sequence

当我在进行此更改后运行验证时,仍然会收到错误:

  

不期望这个元素。预计是(id)。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

XML Schema不允许xs:choice成为xs:all的孩子。

解决方法:

  1. xs:choice元素周围添加包装元素。
  2. 放弃xs:all并通过xs:sequence以固定顺序生活。
  3. 我建议在实践中xs:sequence正常工作并避免此问题以及xs:all经常出现的其他问题,包括违反Unique Particle Principle