Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与XPATH文档顺序混淆_Xpath_Document - Fatal编程技术网

与XPATH文档顺序混淆

与XPATH文档顺序混淆,xpath,document,Xpath,Document,作者在书中解释说: 换句话说,文档顺序只是指节点在XML文档中出现的顺序。例如,当您处理包含其他元素的元素时,顺序是毫无疑问的,但是当您处理同级元素上的元素时,同级元素文档顺序指定它们的顺序应与原始XML文档中的顺序相同 关于文档顺序,还有一件事需要知道,属性节点没有任何特殊顺序,即使是文档顺序 <a> <b/> </a> <a> <c/> <b/> </a> 现在我的问题是—— 为什么不需要属

作者在书中解释说:

换句话说,文档顺序只是指节点在XML文档中出现的顺序。例如,当您处理包含其他元素的元素时,顺序是毫无疑问的,但是当您处理同级元素上的元素时,同级元素文档顺序指定它们的顺序应与原始XML文档中的顺序相同

关于文档顺序,还有一件事需要知道,属性节点没有任何特殊顺序,即使是文档顺序

<a>
  <b/>
</a>
<a>
  <c/>
  <b/>
</a>
现在我的问题是——

  • 为什么不需要属性的顺序

  • “在处理包含其他元素的元素时,顺序毫无疑问,”-为什么

  • -
“在处理包含其他元素的元素时,顺序毫无疑问,”-为什么

很明显,有一个问题,因为你刚刚问过。只是作者出于某种原因认为答案是显而易见的。答案是,如果A是B的祖先,那么A在文档顺序上先于B

<a>
  <b/>
</a>
<a>
  <c/>
  <b/>
</a>
为什么不需要属性的顺序


XML中的一个设计原则是,如果顺序很重要,就不应该使用属性。这与对象建模的语义有关:属性表示独立和正交的对象属性。像形容词一样:说某物是一个红色的大盒子和说它是一个红色的大盒子的意思是一样的。如果不是(如“大白鲨”),那么形容词就不是名词的真正定语限定词,也不应该在XML中作为属性建模。

要详细说明前面的答案并回应第一条评论,我认为它都是围绕层次结构展开的。如果一个元素包含其他元素,则顺序很明显,因为存在层次结构

在下面的示例中,
a
按文档顺序位于
b
之前

<a>
  <b/>
</a>
<a>
  <c/>
  <b/>
</a>
如果结构复杂,这可能会令人困惑。例如,在以下文档中,
d
以文档顺序在
b
之前,即使
d
在层次结构树的较低位置(它是
b
的兄弟
c
的子级)


根据实现对属性的排序方式,您可以获得
a
属性或
b
属性。

为了支持流式传输,文档顺序是“显而易见的”选择,“毫无疑问”,并且在大多数情况下是XML数据最有用的顺序

然而,考虑到XML文档可以表示为树结构,并且XPath在该树上运行,XPath结果的显示顺序并不明显。树遍历是一个有趣的主题,它有许多变体,例如预排序、顺序、呼吸优先和其他几种。(参见维基百科和“树遍历”的其他来源)


因此,尽管作者的描述是正确的wrt XML,但他掩盖了很多事情。特别是关于在树上运行的XPath,OP问题完全有效,并不明显,但已经得到了很好的回答。

我仍然没有抓住作者的要点(有一次,他说,当您处理包含其他元素的元素时,顺序是毫无疑问的,另一方面,他说,当您处理同级元素时,同级元素文档顺序指定它们应该按照原始XML文档中的顺序进行排序。我不确定它的哪一部分你不明白的东西。试试另一本书。我在评论中提到的那句话与我有冲突。因此我感到困惑。我有一些类似的概念性问题。现在你回答得很好。如果你允许的话,我可以亲自发电子邮件给你吗?不太经常,我刚开始
xpath
。所以在阅读书籍时面临一些问题@普里蒂-你不欢迎给我发电子邮件。我的电子邮件是在我的个人资料。我并不总是很快作出反应,虽然如此,你仍然应该考虑StAdvExcel的一个顶级资源。此外,如果我的答案是足够的,请考虑接受它点击旁边的复选标记。谢谢!