模式定义中<xsd:all>和<xsd:sequence>之间的区别?


79

我使用xsd:all的是复杂类型。当我在验证时错过任何必填元素时,它将显示所有元素。它不会显示确切的缺失元素。

但是,如果我使用xsd:sequence我可以得到确切的漏掉的元素。

两者之间有什么区别吗?

xsd:sequence:XML元素必须具有相同的顺序。

但是xsd:all:XML元素可以是任何顺序。


从根本上讲,这两者之间的区别就是您在问题中已经指出的内容。但是,与这两个合成器的使用相关的约束以及在XSD创作中的含义取决于您所指的规范:XSD 1.0或XSD 1.1?
Petru Gardea 2013年

3
看起来您的问题是关于为什么序列和所有发现缺失的元素时都以不同的方式写入错误。我认为这与解析器逻辑有关
Nasir

这个问题已经有答案了吗?我还想知道是否总是需要使用<sequence>来获取确切的丢失对象。
GertV '16

1
您得到的答案不令人满意,因为您的标题具有误导性:答复正确回答了标题中有关“全部”与“序列”的含义的问题。从您的评论看来,您的真正问题似乎是验证器报告两者验证错误的方式不同。这不是一回事,在任何情况下都无法在不知道您使用哪个验证器的情况下回答。
约阿希姆·卢斯

Answers:


129

<xsd:all> 指定子元素可以按任何顺序出现。

<xsd:sequence> 指定子元素只能按提到的顺序出现。

序列示例:

<xs:element name="compElement">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果您从此xsd创建XML,则它将类似于以下内容:

<compElement>
  <ele1>First</ele1>
  <ele2>Second</ele2>
  <ele3>Third</ele3>
  <ele4>Fourth</ele4>
</compElement>

所有示例:

<xs:element name="compElement">
  <xs:complexType>
    <xs:all>
      <xs:element name="ele1" type="xs:string"/>
      <xs:element name="ele2" type="xs:string"/>
      <xs:element name="ele3" type="xs:string"/>
      <xs:element name="ele4" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

如果从此xsd创建XML文件,则该文件可能类似于以下内容:

<compElement>
  <ele2>Second</ele2>
  <ele1>First</ele1>
  <ele4>Fourth</ele4>
  <ele3>Third</ele3>
</compElement>

有关xsd的
更多信息:全部有关xsd的更多信息:顺序

希望我回答了你的问题。


嗨,乔希(Joshi),谢谢您的评论。但是我的问题是,当我使用xsd时针对xsd验证xml时:它不会显示确切的漏掉的元素。例如element1预期是..相反,它将显示所有元素element1,element2, element3,预期,但我为element2和element3给出了minOccurs = 0
user1679378 2013年

2
您可以将“ all”元素的“ minOccurs”属性指定为零。有关更多详细信息,请访问w3schools.com/schema/el_all.asp
Madhusudan Joshi

21

区别:

  • xsd:all- “子元素可以以任何顺序出现,每个子元素可以出现零次或一次”(即maxOccurs可以是0或1)
  • xsd:sequence- “子元素必须出现在序列中。每个子元素可以出现0到任意次数”(即maxOccurs可以是0或任何数字或“无界”)

这里这里的W3Schools教程中。


4
您应该将对粒子基数的约束限定为特定于XSD 1.0-否则,这对于XSD 1.1是不正确的。
Petru Gardea

8
w3schools不隶属于W3C,因此其网页不是W3C文档。
Ben Companjen 2014年

@kamituel您能列举哪里<xs:all>限制子元素出现的次数吗?我在W3C规范中找不到这方面的证据。
路加·普普利特

2
@kamituel实际上,这适用于架构中其容器内的所有元素本身。您引用的文档是1.1,没有约束。无论如何,正如您在答案中粘贴的那样,我确实在“人类英语”中找到了它的约束,在1.0文档的上方几行。
路加·普普利特

1
“子元素可能出现零次或一次”实际上是不正确的!minOccurs的默认值为1,这意味着它必须存在,并且适用于all和sequence。
PKCS12

2

所有指标

<all>指标指定子元素可以以任何顺序出现,并且每个子元素只能出现一次:

顺序指示器

<sequence>指标指定子元素必须以特定顺序出现:

参考链接


2
您应该将对粒子基数的约束限定为特定于XSD 1.0-否则,这对于XSD 1.1是不正确的。
Petru Gardea

2

该模式仅定义构成合规文档的内容。

如何报告不符合项完全取决于验证者。没有什么可以阻止验证程序准确报告丢失的字段,但是显然在这种情况下您不会使用。

无论是错误还是设计使然,您都必须与验证程序的提供者进行讨论。


那如何回答这个问题?
塞巴斯蒂安·霍夫曼'18

2
这个问题似乎是在询问序列和所有序列之间的区别,但是更全面的阅读显示作者已经知道这一点,但是对于验证器的输出感到困惑。这就是如何。
Joachim Lous '18

1

简单的XML示例:

<school>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</school>

XML的XSD(解释):

<xs:element name="school">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

这里:

xs:element:定义一个元素。

xs:all:表示子元素可以按任何顺序出现。

xs:sequence:表示子元素仅按提到的顺序出现。

xs:complexType:表示它包含其他元素。

xs:simpleType:表示它们不包含其他元素。

类型: 字符串,十进制,整数,布尔值,日期,时间,

  • 简而言之,xsd是表示和验证具有特定类型的XML数据的另一种方法。
  • 借助额外的属性,我们可以执行多个操作。

  • 在xsd上执行任何任务都比xml简单。


0

当我们使用under标记时,它指示在complexType中声明的所有元素必须在XML文档中以相同的顺序出现。否则,您将得到一个错误。因为不需要按正确的顺序指定元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.