Xml 两个兄弟姐妹的顺序是否依赖于实现?

Xml 两个兄弟姐妹的顺序是否依赖于实现?,xml,tree,documentation,xquery,Xml,Tree,Documentation,Xquery,如果我有这样一个XML文档: <people> <person> <name> Mario </name> <age> 25 </age> </person> <person> <name> Lucas </name> <age> 32 </age> <

如果我有这样一个XML文档:

<people>
    <person>
        <name> Mario </name>
        <age> 25 </age>
    </person>
    <person>
        <name> Lucas </name>
        <age> 32 </age>
    </person>
</people>

马里奥
25
卢卡斯
32

总是保证在文档顺序中,Mario出现在Lucas之前?因此,Lucas始终是Mario的兄弟姐妹,或者它依赖于实现?

与属性不同,根据:

请注意,属性规范在开始标记或 空元素标记不重要

元素顺序在XML中很重要。

然而,令人惊讶的是,XML建议并没有明确声明元素顺序的重要性。语法意味着元素顺序是重要的,但与属性不同,对于元素顺序的重要性没有明确的说明

在以下情况下,存在以下情况:

定义:在这种情况下,约束包括一个内容模型,一个 控制子元素和子元素的允许类型的简单语法 允许它们出现的顺序

但这是对DTD元素类型声明的引用。xsd同样可以声明排序对于文档有效性是重要的(通过
xsd:sequence
)或不重要的(通过
xsd:all
)。对于任何给定的应用程序,顺序可能仍然重要,也可能不重要——这取决于应用程序。[感谢@C.M.Sperberg McQueen对有效性与任何给定申请目的之间相关性差异的有益澄清。]

元素排序的重要性见:

元素信息项具有以下属性:

[……]

  • [子项]文档中子项信息项的有序列表 秩序。此列表包含元素、处理指令、未展开的 实体引用、字符和注释信息项,一个用于 每个,处理指令,引用一个未处理的 外部实体、数据字符和注释立即出现 在当前元素中。如果元素为空,则此列表没有 成员们

  • 尽管,正如@kjhughes所说,XML建议并没有明确说明这一点,但所有构建在XML之上的api和工具都假定元素顺序是重要的,由解析器保留并报告给应用程序


    毕竟,您不希望Word文档中的段落被随机地混洗。(可能是因为XML设计师专注于建模文档,所以他们什么也没说:这很明显,不需要说。)

    我希望我能把这一点提高到+1以上,因为我确实学到了一些关于XML的新东西,而且我现在已经广泛使用了一段时间。我真的很惊讶,它没有在规范中定义。但是,正如Michael Kay所说,我从未遇到过任何处理器不尊重元素顺序。请注意从xsd:all和xsd:sequence推断的内容。它们意味着订单是或不是有效的条件;他们没有说它是否“重要”或是否向应用程序传递信息。如果元素的目的是提供元素a、B和C的排序,那么xsd:all需要所有三个元素,这将是正确的内容模型;在这里,订购可能是对应用程序唯一重要的事情。@C.M.Sperberg-McQueen:我感谢您的澄清。答案已更新。谢谢。它说:“兄弟节点的相对顺序是它们在其父节点的children属性中出现的顺序”。由于文档顺序受到一些规则的约束,但依赖于实现,我假设Mario出现在Lucas之前,只是因为所有XML解析器都是串行解析文档的,但Mario出现在Lucas之前的标准并不要求这样做,对吗?@Ramyazuhouri,不,不是这样。XML规范对此问题保持沉默,但XML信息集和XPath数据模型并非沉默。任何显示不同顺序的XQuery实现都是不一致的(或者使用从XML到XDM的非标准映射)。