在XML中,顺序重要吗?

时间:2009-07-15 13:46:07

标签: xml

公共父元素在XML中出现的顺序是XML文档捕获的有意义的数据,还是未指定为有意义的顺序?例如,考虑两个XML文档:

<people>
 <person name="sam"/>
 <person name="juni"/>
</people>

<people>
 <person name="juni"/>
 <person name="sam"/>
</people>

这些文件是否被视为代表相同的数据,还是被捕获的顺序不同?

11 个答案:

答案 0 :(得分:49)

元素的顺序在XML中很重要,因此在您的示例中,两个文档是不同的。但是,属性顺序并不重要。

<people>
  <person name="kathy" id="1"/>
</people>

这与:

完全相同
<people>
  <person id="1" name="kathy"/>
</people>

答案 1 :(得分:22)

它们不相同 - 序列是否重要取决于程序或处理它的用户。例如,XHTML文档中的元素序列决定了它们在浏览器中的显示方式,搜索引擎使用文档中的位置来判断数据的相对重要性。

答案 2 :(得分:19)

订单可能很重要,但这取决于传输的内容。

例如,在XHTML中,顺序非常很重要 - 如果你有一个随机顺序的兄弟段落,那将非常混乱!

在许多其他情况下,它并不重要。

XML只是表示节点树的一种方式。 XML本身表示订单很重要:例如,API必须保留订单 - 但这取决于产生/解释数据的任何内容真正关心订单。

XML规范实际上必须“在排序方面犯错” - 如果您不关心它,很容易忽略排序,但如果API决定转换,重构排序是一件痛苦的事。 (您必须将订单放入属性等。)

答案 3 :(得分:5)

虽然就XML标准而言,XML属性排序并不重要,但XML的文本表示确实将属性放在特定的顺序中。这可能是XML Signature等问题,它为XML文档生成数字签名。不同的属性顺序会生成不同的签名,这显然是错误的。

由于这个(和其他)原因,现在有一个XML规范化的标准,它定义了重新组织XML文档的规则,使它们保留相同的信息内容,但是有空格,命名空间声明和属性重新排列的内容。一种可预测的方式。

来自xml.com

  

Canonical XML需要包含   名称空间声明和   升序词典中的属性   顺序。

答案 4 :(得分:5)

从纯粹的XML有效性角度来看,它取决于描述格式化XML的规则的架构(如果有的话)。

尽管如此,必须保留订单(参见http://www.w3.org/TR/xml-infoset/中的2.1.1),但是它是否重要&#34;应用程序取决于其作者。

在模式中,使用xs:all合成器可能会使顺序变得不重要,但我不确定这会影响捕获顺序的保留,即我仍然期望XML处理器维护原产地/序列化的订单。

但是,在1.0中,这个合成器会对子元素添加一个限制,使它们必须出现0或1次。在XSD 1.1中,此限制已被删除,从而更容易合同指定订单不重要,有效xs:all已成为xs:sequence的无序版本。

由于过度限制的1.0 xs:all合成器,必须使用有序的xs:sequence合成器。因此,订单经常被人为强加。

验证器库供应商采用1.1的速度很慢。

因此,API在使用新元素进化时需要考虑顺序。我不知道任何可以使用1.1的XML序列化框架,你必须假设你的客户端将使用1.0,并将使用1.0规则验证1.1传入消息并阻塞。

答案 5 :(得分:4)

根据this article,该标准的1.0版本甚至不要求解析器按照它们在文档中出现的顺序报告兄弟姐妹。从这个角度来看,他们不会被认为是不同的,因为两个孩子都在那里。也许这已经改变了,所以其他答案也适用于较新版本的XML。

答案 6 :(得分:3)

XML 1.0 Spec没有说明具有相同名称的元素作为同一父元素的子元素的顺序。所以看来,问题是未定义的。

但是,大多数XML解析器和API将保留文本表示中给出的序列。因此,可以实现关注元素顺序的应用程序。事实上你的问题的答案是:是的,这个命令很重要。这两个例子是不同的。

仔细观察,您需要了解您的用例。如果您的XML需要与不同的(可能是第三方)应用程序进行互操作,那么您应该始终认为该订单很重要。如果您完全控制生产和消费应用程序,那么您可以放宽此规则。

一如既往,你必须要判断。

答案 7 :(得分:1)

有区别。您可以使用各种XML API按顺序处理元素或按索引查找元素。当然,在您的特定示例中,顺序可能无关紧要,但这取决于数据的语义。

答案 8 :(得分:1)

捕获订单。

答案 9 :(得分:1)

我认为这些应该被认为是相同的,但这完全取决于软件或阅读它的人来决定。 XML只是一种写出数据的方式。应用程序确定如何使用该数据,因此确定了其中的大部分含义。

如果您的应用程序读入所有人员元素,然后按名称对其进行按字母顺序排列,则XML文档中的顺序毫无意义。如果您的应用程序读入它们并按照人们出现在XML中的相同顺序分配席位,那么顺序非常重要。

由使用数据的应用程序决定。如果订单很重要,则应在生成文件的人员的规范中对其进行描述。

答案 10 :(得分:1)

http://www.ibm.com/developerworks/xml/library/x-eleord.html

也许文章中的讨论将有助于回答您的问题。由于您的问题有些开放,我不确定它是否涵盖您的问题。