为什么节点顺序在XML中很重要?

hel*_*dre 7 xml xsd

我最近一直在处理一个API,它要求XML文档的节点按特定顺序排列.我想知道为什么他们觉得有必要强制执行这个,因为我完全没有理由认为事情应该像这样.

对于intance,这是正确的(xml大大简化)

<transaction>
    <address>1 main st</address>
    <amount>100</amount>
    <orderId>1234</orderId>
</transaction>
Run Code Online (Sandbox Code Playgroud)

但这会返回错误

<transaction>
    <address>1 main st</address>
    <orderId>1234</orderId>
    <amount>100</amount>
</transaction>
Run Code Online (Sandbox Code Playgroud)

起初我以为它们可以以列表/数组形式存储事物并使索引始终引用同一节点.我理解为什么以相同的顺序发送具有相同名称的兄弟节点很重要,如本问题所述.但是,有些节点可以省略:

<transaction>
    <amount>100</amount>
    <orderId>1234</orderId>
</transaction>
Run Code Online (Sandbox Code Playgroud)

因此,在第三个示例中,amount和orderId现在将在[0]和[1]而不是第一个(正确)示例中的[1]和[2].

另一个想法是他们将XML作为一个字符串处理并要求他们总是知道哪些节点在彼此之后,但是再次允许省略节点,这个理论没有意义.

任何人都可以向我解释为什么我给节点的顺序很重要?或者我只是处理一个老而脾气暴躁的API?

Rob*_*ney 17

节点顺序显然在XML中很重要,如下所示:

<p>
   <span>This wouldn't make much sense</span>
   <span>if the order of these nodes were reversed.</span>
</p>
Run Code Online (Sandbox Code Playgroud)

它在XML中不那么明显,就像你提供的那样,它似乎是某种序列化格式.但是,如果未按正确的顺序设置属性,则属性设置器具有副作用的对象可能会失败.

想象一个具有Person公开PersonIDName属性的私有字段的类.该PersonIDsetter创建的私有实例Person,以及Name设置器的Name对私有财产Person领域.在这种情况下,设置Name之前的设置PersonID失败,因为Person还不存在.

在这种情况下,实现需要在XML PersonID之前出现的模式可以Name防止此错误发生,代价是迫使其他开发人员执行明显无意义的事情.

在这样的情况下,显而易见的事情是找到编写该课程并打败他的开发人员.尽管考虑一个它所处的世界是有趣的,但这很难实现.


小智 5

XML节点顺序可能很重要的一个原因是应用程序正在使用流式解析器.具有预期顺序的依赖元素可以允许应用程序更有效地处理XML数据.对于处理大规模XML数据的应用程序尤其如此.


Joh*_*ers 2

代码依赖于元素的顺序更快更简单。

当允许任意顺序时,它还可以防止某些含糊不清的问题。

此外,XML 并不适合人类读者,而是供计算机程序使用。计算机不介意按顺序做事。