XML是否关心元素的顺序?

60

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>

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

供应商表示XML无效,因为第4个驱动程序在错误的区域。 驱动程序的XPath应为root / Request / Driver,而车辆为root / Request / Vehicle。

如果没有XSD可以与之比较XML,那么XML解析器是否会强制执行元素顺序?由于供应商的支持缓慢,所以我想知道好的常规做法。

跟进

我向我们的客户代表抱怨了足够多,因为我不能测试这个问题(并且让他们觉得他们只是在试图寻求支持),结果开发人员有XSD,但支持人员没有。因此,我一直在与错误的组交谈*摊手*

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

现在要争取他们自己的示例XML遵循模式,但至少现在我有可供测试的东西。


2
供应商应提供XSD或支持文档,详细说明软件对XML格式的假设,包括元素顺序。否则,您必须猜测。读取XML文档的软件不应强制执行顺序(如果可能),但这并不罕见。 XSD是明确定义交换格式规则的文档。另请参阅http://kettle.pentaho.com/。 - Dave Jarvis
7个回答

73

#XML模式组合器"sequence"将强制排序

直到今天,我最有可能用“否则,除非你使用编写不良的xml解析器”来回答“XML是否关心元素的顺序?”这个问题。

然而,今天第三方应用程序抱怨我创建的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>

关键字是xs:sequence

序列元素指定子元素必须按顺序出现。每个子元素可以出现0到任意多次。

这与xs:all不同,后者不关心顺序,只允许出现零次或一次的元素。

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

(单词sequenceall都被称为XML模式定义中的组合子。)


3
+1 这个问题让我在 Amazon AWS 上花费了好几天的时间,如果有其他人也遇到了同样的问题,希望我的经验可以帮到你们。我从来没有想过子元素的顺序会有影响。正如答案所指出的那样,“顺序”是关键。 - jtubre
5
这应该是被采纳的答案。 - user7610

26

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

在您的情况下,它是格式正确的。没有重叠的XML标签,没有未关闭的XML标签或其他任何类型的错误。

如果供应商需要强制执行XML内部的顺序,他应该提供一个XSD文件 - 否则,他的“要求”无法进行验证和检查....


1
这正是我所想的,我想要确认一下。我们构建的 XML 解析器可以很好地处理上述 XML,并且不会生成任何错误,但是没有 XSD,你怎么能确定呢? - dragonmantank
1
如果供应商使用古老的工具集,DTD也可以确定有效性。 - brianary
虽然没有模式指定则没有隐含的排序,但混合内容的情况可能不同。虽然我没有检查规范,但如果子元素是混合内容值的一部分,则它们的顺序必须是重要的,否则它将成为最无用的可能解释。 - ACProctor

5

厂商们会按照他们的意愿去做,但是依赖排序的 XML 应用是一种非标准应用。

XML 是声明式的,而不是过程式的。因此,它不应该是“逐步”的。


12
然而你的段落将按照你输入的顺序呈现! - brianary
1
@brianary 的观点很好。我从未见过在 XHTML 中使用属性标记段落以指示它们的顺序! - Jon Coombs

5

XML模式可以强制执行元素顺序。如果没有模式,则理论上既没有顺序,也没有标签,也没有一般结构或文本类型(如果是数字或其他任何内容)的规定。当然,在这里并非如此。

完全可以在不考虑顺序的情况下解析XML中的数据,但是如果假定某种顺序,则可能更容易解析(例如使用SAX时,或者当您是写非常懒惰的代码的懒汉时)。尽管他们应该包含一些模式以便按照某个顺序进行解析,但是很可能他们的解析器仍会出错。是的,他们不应该这样做,但显然他们并不关心。

*“解析”并不意味着“将XML文档转换为DOM”之类的操作,而是“从例如DOM中提取信息”的意思。


4

通过DOM访问XML可以保留节点在XML文档中的顺序。请看这里:

http://www.w3schools.com/dom/dom_nodes_nodelist.asp

在这里你会发现:

一个节点列表对象表示一个节点列表,按照XML中的顺序排列。

你的Web服务是否依赖于顺序是一个不同的问题——它可能依赖也可能不依赖,这取决于Web服务的实现。


3

XML模式可能会或可能不会强制元素顺序。这取决于具体的模式。从最一般的意义上讲,除非适当的模式另有规定,否则XML元素顺序并不重要。


0

我认为最好的答案是-询问他们。他们甚至可以将您的XML解析为文本文件,因此您可能需要换行符和一些“正确”的属性顺序。

如果他们正确解析这个问题,则顺序不重要(至少在有效请求方面)。据我所见,他们应该构建两个表格并使用提供的ID将它们连接起来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接