XML关心元素的顺序吗?

dra*_*ank 32 xml xsd

XML有时会让我感到困惑,但我正试图解决这个问题.供应商告诉我的内容没有意义但是,我和XML并不相处:)

我有一些XML,我发送给供应商的Web服务,给我随机的失败:

<root>
    <Request>
        <Driver id="1" VehId="1">...</Driver>
        <Driver id="2" VehId="1">...</Driver>
        <Driver id="3" VehId="2">...</Driver>
        <Vehicle id="1">...</Vehicle>
        <Vehicle id="2">...</Vehicle>
        <Driver id="4" VehId="2">...</Driver>
    </Request>
</root>
Run Code Online (Sandbox Code Playgroud)

没有要比较的XSLT或XSD,以查看我的XML是否有效.

供应商声明XML无效,因为Driver#4位于错误的区域.驱动程序的XPath应该是root/Request/Driver,Vehicle是root/Request/Vehicle.

XML解析器是否会强制执行元素顺序,特别是如果没有XSD来比较XML?供应商对我的支持很慢,所以我想知道什么是好的常见做法.

跟进

我抱怨我们的帐户代表不能测试这个(并且听起来好像他们只是想获得支持资金),事实证明开发人员有XSD,但支持没有.所以我一直在和错误的小组交谈*facepalm*

我得到了XSD,它确实强制执行特定的元素顺序.

现在就他们自己的样本XML来对抗它们并不遵循模式,但至少现在我有一些东西需要测试.

Jür*_*ock 27

XML模式合成器"序列"将强制执行排序

我知道这已经老了,但我刚刚上了帖子.

直到今天,我将最有可能回答这个问题Does XML care about the order of elements?No, unless you use a poorly written xml parser.

但是,今天第三方应用程序抱怨我创建的xml文件无效.他们使用XSD文件来验证xml.是的,您可以在xsd文件中强制执行一个或多个元素:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ComplexType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" default="" name="Value1" type="xs:string" />
      <xs:element minOccurs="0" maxOccurs="1" default="" name="Value2" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

关键字是 xs:sequence

sequence元素指定子元素必须出现在序列中.每个子元素可以从0到任意次出现.

与此相反,xs:all它不关心顺序,只允许出现零或一次的元素.

指定子元素可以按任何顺序出现.每个子元素可以出现0或1次

(单词sequence并且all都是XML Schema定义中的Compositor.)

  • 这应该是接受的答案。 (4认同)
  • +1 这花了我好几天的时间来使用 Amazon AWS feed,以防其他人被困在这里。我从来没有想过子元素顺序很重要。正如答案指出的那样,“顺序”是关键 (3认同)

mar*_*c_s 19

如果手边没有XSD(XML模式),那么您可以检查的是XML是否格式正确.

在你的情况下 - 它是.没有重叠的XML标记,没有打开的XML标记或任何类型的XML标记.

如果供应商需要在XML中强制执行命令,那么他应该提供XSD文件 - 否则,他的"要求"无法验证和检查....


Bug*_*boy 5

供应商会做他们会做的事情,但依赖排序是 XML 的非标准应用。

XML 是声明性的,而不是过程性的。所以,不应该是“循序渐进”。

  • 然而您的段落会按照您输入的顺序呈现! (13认同)

小智 5

XML 模式可以强制执行元素顺序。如果没有模式,则无论是顺序、标签还是一般结构,都不是文本类型(如果它是数字或任何东西)在理论上以任何方式规定。当然,这里的情况并非如此。

完全可以在不关心顺序的情况下从 XML 解析*数据,但是如果您假设某种顺序,则解析可能会更容易(例如,我想,当使用 SAX 时,或者当您是一个编写非常草率的代码的懒惰混蛋时) 。尽管如果他们想要某种顺序,他们应该包含一些模式,但他们的解析器很可能会被它阻塞。是的,他们不应该这样做,但显然他们不在乎。

*我所说的“解析”并不是指“获取该 XML 文档并将其转换为 DOM”,而是“获取该 DOM 并从中提取信息”。