有关w3school提供的XPath教程的问题

时间:2013-11-27 03:25:06

标签: javascript xml xpath

这是链接 http://www.w3schools.com/xpath/xpath_examples.asp

所以点击第一个自己尝试,你会看到一段代码。我不知道这部分意味着什么

while (result)
{
    document.write(result.childNodes[0].nodeValue);
    document.write("<br>");
    result=nodes.iterateNext();
}

结果那里应该是最不重要的节点,并且应该没有childNodes。根据W3C标准,第一个节点应表示为节点[1]。所以我开始认为原子值是一个节点,然后对代码做了一些修改。

我更改了xpath表达式和while循环

  path="/bookstore/book";
  ...
  // original codes
  ...
  while (result)
  {
      document.write(result.childNodes[1].childNodes[0].nodeValue);
      document.write("<br>");
      result=nodes.iterateNext();
  }
  /* result
    Everyday Italian
    Harry Potter
    XQuery Kick Start
    Learning XML
  */

似乎运作良好。然后是另一个修改:

  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
 */

childNode [1]表示book-title的fisrt childNode,而childNode [3]表示第二个作者?然后我确信childNode [2]应该是 title 的原子值。但是,当我尝试使用childNode [2]显示它并失败时,我不会向您显示更多代码 - 这里已经是一堆代码。那么,任何人都可以向我解释一下吗?

还有一个问题:

请参阅此处的链接http://www.w3schools.com/xpath/xpath_axes.asp

它引入了 xpath轴位置路径表达式,但在代码中没有给出示例。我很难想象如何使用它,任何人都可以发布一些例子并启发我吗? (我主要使用java)

1 个答案:

答案 0 :(得分:1)

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

您必须了解在DOM和带有<foo>bar</foo>的XPath模型中,foo元素节点带有子节点,文本节点的内容为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>

可以有book个元素节点,其中有9个子节点,第一个(在DOM 0集合中具有索引childNodes,在XPath中具有索引1 {{ 1}})是一个带有空格的文本节点,第二个是./child::node()元素,第三个是带有空格的文本节点,第四个(带有DOM索引title)是{{1元素。

当然,对于XPath,如果您知道自己只对元素节点感兴趣,则不会选择3,而是为第二个元素子项选择author,或者仅为node()[4]选择*[2] author元素子节点。