Javascript 关于w3school提供的XPath教程的问题

Javascript 关于w3school提供的XPath教程的问题,javascript,xml,xpath,Javascript,Xml,Xpath,这里是链接 因此,单击第一个自己尝试一下,您将看到一段代码。我不知道这部分是什么意思 while (result) { document.write(result.childNodes[0].nodeValue); document.write("<br>"); result=nodes.iterateNext(); } childNode[1]表示书名的第一个childNode,childNode[3]表示第二作者?然后我确信childNode[2]应该

这里是链接

因此,单击第一个自己尝试一下,您将看到一段代码。我不知道这部分是什么意思

while (result)
{
    document.write(result.childNodes[0].nodeValue);
    document.write("<br>");
    result=nodes.iterateNext();
}
childNode[1]表示书名的第一个childNode,childNode[3]表示第二作者?然后我确信childNode[2]应该是title的原子值。但是当我尝试使用childNode[2]显示它时失败了,我不会再显示更多的代码——这里已经有很多代码了。那么,有人能给我解释一下吗

还有一个问题:

请参阅此处的链接


它引入了xpath轴位置路径表达式,但代码中没有给出示例。我几乎无法想象如何使用它,谁能举一些例子来启发我?(我主要使用java)

您混淆了DOM模型和XPath模型。在DOM模型中,节点有一个
childNodes
属性,其中索引以
0
开头,
childNodes
包含所有类型的节点(元素节点、文本节点、CDATA节节点、注释节点、处理指令节点)。XPath数据模型不同,其路径表达式也不同于DOM子节点。XPath中的位置谓词以
1
开头,而不是以
0
开头。您的示例使用XPath来寻址DOM树中的
book
元素,然后使用DOM API更改为寻址子节点。这通常是在浏览器环境中完成的,因为浏览器实现了W3CDOM,但有时在DOM树上提供XPath选择

您必须了解,在DOM和带有
bar
的XPath模型中,都有带有子节点的
foo
元素节点,一个带有contents
bar
的文本节点。您看到的示例是使用XPath选择元素节点,然后有时使用childNodes集合来寻址文本子节点并提取其DOM
nodeValue
属性。至少对于Mozilla、Opera、Chrome分支来说,这是不必要的代码,而不是
foo.childNodes[0]。nodeValue
您只需访问
foo.textContent
。但所有这些都是DOM,而不是XPath

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

日常意大利语
吉娅达·德·劳伦蒂斯
2005
30
可以有一个
book
元素节点,该节点有9个子节点,第一个(在DOM
childNodes
集合中具有索引
0
,在XPath
/child::node()
中具有索引
1
)是带空格的文本节点,第二个是
title
元素,第三个是带空格的文本节点,第四个(DOM索引为
3
)是
author
元素


当然,对于XPath,如果您知道您只对元素节点感兴趣,那么您不会选择
node()[4]
,而是会选择
*[2]
作为第二个元素子节点,或者干脆选择
author
作为author元素子节点。

对于记录,它充满了错误信息,我建议学习时不要访问他们的网站。这看起来像JavaScript,与Java不同。@yshavit我知道它是JavaScript,我的意思是希望有人能用Java解决我的第二个问题。我还没有开始使用DOM模型,但为什么
result.childNodes[2].childNodes[0].nodeValue)
不提供作者,而
结果.childNodes[3].childNodes[0].nodeValue)
do?我是否可以认为将xpath和DOM结合在一起应该是解析XML的有效方法?根据解析器的不同,元素节点之间有空白缩进的XML文档可能在元素节点之间的
childNodes
集合中有文本节点。这可能会导致元素节点的索引不同于某些人的预期。
  path="/bookstore/book";
  ...
  // original codes
  ...
  while (result)
  {
      // the only change is here      **
      document.write(result.childNodes[2].childNodes[0].nodeValue);
      document.write("<br>");
      result=nodes.iterateNext();
  }
  /* result
    blank
  */
      document.write(result.childNodes[3].childNodes[0].nodeValue);
 /* result
   Giada De Laurentiis
   J K. Rowling
   James McGovern
   Erik T. Ray
 */
<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>