作者在他的书中说,在做文档顺序解释时:
换句话说,文档顺序只是指节点在 XML 文档中出现的顺序。例如,当您处理包含其他元素的元素时,顺序毫无疑问,但是当您处理同一级别的元素(兄弟元素)时,文档顺序指定它们应该按照它们在原始 XML 文档。
关于文档顺序还有一点需要了解——属性节点没有任何特殊顺序,即使是文档顺序。
现在我的问题是——
为什么不需要属性的顺序?
“当你处理包含其他元素的元素时,顺序毫无疑问,” - 为什么?
-
为了详细说明之前的答案并回复第一条评论,我认为这一切都围绕着层次结构。如果一个元素包含其他元素,则顺序很明显,因为存在层次结构。
在以下示例中,按文档顺序a
排在前面。b
<a>
<b/>
</a>
在以下示例中,b
和c
是兄弟姐妹(都在同一级别; 的子级a
)。兄弟姐妹的文档顺序不是很明显,但在文档顺序c
之前b
。
<a>
<c/>
<b/>
</a>
如果结构复杂,这可能会让人感到困惑。例如,在下面的文档中,即使在层次树的更下方(它是的兄弟的子级),文档顺序也在d
前面。b
d
b
c
<a>
<c>
<d/>
</c>
<b/>
</a>
不需要属性的顺序,因为它们不代表层次结构。他们只是描述/进一步定义元素。想想元数据。他们真正拥有的唯一文档顺序是元素属性在任何该元素子元素之前。属性的相对顺序取决于实现。
例如,如果您/*/@*[1]
在以下文档中使用 XPath:
<foo b="x" a="x"/>
您可以根据实现对属性的排序方式来获取a
属性或b
属性。
“当你处理包含其他元素的元素时,顺序毫无疑问,” - 为什么?
嗯,显然有一个问题,因为你刚刚问过了。只是作者出于某种原因认为答案是显而易见的。答案是,如果 A 是 B 的祖先,那么 A 在文档顺序上在 B 之前。
为什么不需要属性的顺序?
如果顺序很重要,则不应使用属性,这是 XML 的设计原则。这与对象建模的语义有关:属性表示对象的独立且正交的属性。就像形容词一样:说某物是一个大红色的盒子和说它是一个红色的大盒子的意思一样。如果不是(如“大白鲨”),那么形容词就不是名词的真正定语限定词,不应该在 XML 中建模为属性。
为了支持流式传输,文档顺序是“显而易见的”选择,“毫无疑问”,并且在大多数情况下对 XML 数据最有用。
但是,考虑到 XML 文档可以表示为树结构,并且 XPath 在该树上运行,XPath 结果的呈现顺序远非显而易见。树遍历是一个有趣的主题,它有许多变化,例如预排序、有序、呼吸优先和其他几个。(参见维基百科关于“树遍历”的其他来源)。
因此,尽管作者对 XML 的描述是正确的,但他掩盖了很多事情。特别是关于在树上运行的 XPath,OP 问题是完全有效的,并不明显,但已经得到很好的回答。