【问题标题】:Does XML care about the order of elements?XML 是否关心元素的顺序?
【发布时间】:2010-12-01 20:37:03
【问题描述】:

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 位于错误区域。 Driver 的 XPath 应该是 root/Request/Driver,Vehicle 是 root/Request/Vehicle。

XML 解析器强制元素顺序是否很常见,尤其是在没有 XSD 可与 XML 进行比较的情况下?供应商的支持回复我的速度很慢,所以我想知道什么是好的常见做法。

跟进

我向我们的客户代表抱怨了很多关于无法对此进行测试(并且听起来他们只是想获得支持资金),事实证明开发人员有 XSD,但支持没有。所以我一直在与错误的组*facepalm*交谈

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

现在就他们自己的示例 XML 与他们抗争不遵循架构,但至少现在我有一些东西可以测试。

【问题讨论】:

  • 供应商应提供 XSD 或支持文档,详细说明软件对 XML 格式所做的假设,包括元素顺序。否则你必须猜测。读取 XML 文档的软件不应强制执行命令(如果可能),但这种情况并不少见。 XSD is 文档明确定义了交换格式规则。另请参阅kettle.pentaho.com

标签: xml xsd


【解决方案1】:

XML 模式合成器“序列”将强制排序

我知道这是旧的,但我只是看到了这个帖子。

直到今天,我很可能会用No, unless you use a poorly written xml parser. 回答问题Does XML care about the order of elements?

但是,今天第三方应用程序抱怨我创建的 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 不同,xs:all 不关心顺序,只允许出现零次或一次的元素。

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

sequenceall 这两个词在 XML Schema 定义中都称为 Compositor。)

【讨论】:

  • +1 这花了我几天的时间来使用 Amazon AWS 提要,以防其他人被困在这里。我什至从未想过子元素顺序很重要。正如答案指出的那样,“顺序”是关键
  • 这应该是已接受的答案。
【解决方案2】:

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

在你的情况下 - 它是。没有重叠的 XML 标记,没有打开的 XML 标记或任何类似的东西。

如果供应商需要在 XML 中强制执行诸如 order 之类的事情,他应该提供一个 XSD 文件 - 否则,他的“要求”将无法验证和检查....

【讨论】:

  • 这正是我的想法,我想确定一下。我们构建的 XML 解析器在上面的 XML 上工作得很好,不会产生任何错误,但是没有 XSD 你怎么能确定呢?
  • DTD(如果供应商使用的是古老的工具集)也可以确定有效性。
  • 虽然没有指定模式的隐含排序,但混合内容的情况可能会有所不同。虽然我没有检查规范,但如果子元素是混合内容值的一部分,那么它们的顺序必须很重要,否则这将是最无用的解释。
【解决方案3】:

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

XML 是声明性的,而不是程序性的。所以,它不应该是“逐步”的。

【讨论】:

  • 然而你的段落是按照你输入的顺序呈现的!
  • @brianary 的好点子。我从来没有在 XHTML 中看到用属性标记的段落来表明它们的顺序!
【解决方案4】:

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

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

你会发现:

一个节点列表对象代表一个列表 节点的顺序与 XML。

如果您的网络服务依赖订单是一个不同的问题 - 它可能会或可能不会,这取决于网络服务的实施。

【讨论】:

    【解决方案5】:

    XML 模式可以强制元素顺序。如果没有模式,则无论是顺序还是标签,也不是一般结构,也不是文本类型(如果它是数字或任何东西)以任何方式规定 - 理论上。当然这里不是这样。

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

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

    【讨论】:

      【解决方案6】:

      XML 模式可能会也可能不会强制元素顺序。这取决于所讨论的架构。在最一般的意义上,XML 元素顺序无关紧要,除非相应的架构另有规定。

      【讨论】:

        【解决方案7】:

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

        如果他们能正确解析这个顺序就没有关系(至少在有效请求方面不重要)。在我看来,他们应该构建两个表并使用提供的 ID 将它们连接起来。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          • 2015-04-05
          • 2011-10-10
          • 1970-01-01
          • 1970-01-01
          • 2010-11-29
          • 2015-04-21
          相关资源
          最近更新 更多