文章目录
  1. 1. XML实例文档
  2. 2. 节点
    1. 2.1. 基本值(原子值)
    2. 2.2. 项目
    3. 2.3. 节点关系
  3. 3. 语法
    1. 3.1. 选取节点
    2. 3.2. 谓语
    3. 3.3. 选取未知节点
    4. 3.4. 选取若干路径
  4. 4.
    1. 4.1. 位置路径表达式
    2. 4.2.
  5. 5. 运算符
  6. 6. 实例
    1. 6.1. 选取节点

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 使用路径表达式在 XML 文档中进行导航,包含一个标准函数库,是 XSLT 中的主要元素。

XML实例文档

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

节点

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

例如:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)

基本值(原子值)

基本值是无父或无子的节点。

例如:

J K. Rowling
"en"

项目

项目是基本值或者节点。

节点关系

  1. 同胞
  2. 先辈
  3. 后代

语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

选取节点

常用路径表达式:

1. nodename     选取此节点的所有子节点。
2. /         从根节点选取。
3. //         从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
4. .         选取当前节点。
5. ..         选取当前节点的父节点。
6. @         选取属性。

实例:

1. bookstore         选取 bookstore 元素的所有子节点。
2. /bookstore         选取根元素 bookstore。
3. bookstore/book         选取属于 bookstore 的子元素的所有 book 元素。
4. //book         选取所有 book 子元素,而不管它们在文档中的位置。
5. bookstore//book         选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
6. //@lang         选取名为 lang 的所有属性。

谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。

实例:

1. /bookstore/book[1]         选取属于 bookstore 子元素的第一个 book 元素。
2. /bookstore/book[last()]         选取属于 bookstore 子元素的最后一个 book 元素。
3. /bookstore/book[last()-1]         选取属于 bookstore 子元素的倒数第二个 book 元素。
4. /bookstore/book[position()<3]         选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
5. //title[@lang]         选取所有拥有名为 lang 的属性的 title 元素。
6. //title[@lang='eng']         选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
7. /bookstore/book[price>35.00]         选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.008. /bookstore/book[price>35.00]/title         选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00

选取未知节点

1. *         匹配任何元素节点。
2. @*         匹配任何属性节点。
3. node()         匹配任何类型的节点。

实例:

1. /bookstore/*         选取 bookstore 元素的所有子元素。
2. //*         选取文档中的所有元素。
3. //title[@*]         选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径

实例:

1. //book/title | //book/price         选取 book 元素的所有 title 和 price 元素。
2. //title | //price         选取文档中的所有 title 和 price 元素。
3. /bookstore/book/title | //price         选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

轴可定义相对于当前节点的节点集。

ancestor     选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self     选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute     选取当前节点的所有属性。
child     选取当前节点的所有子元素。
descendant     选取当前节点的所有后代元素(子、孙等)。
descendant-or-self     选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following     选取文档中当前节点的结束标签之后的所有节点。
namespace     选取当前节点的所有命名空间节点。
parent     选取当前节点的父节点。
preceding     选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling     选取当前节点之前的所有同级节点。
self     选取当前节点。

位置路径表达式

位置路径可以是绝对的,也可以是相对的。绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

绝对:

/step/step/...

相对:

step/step/...

语法:

轴名称::节点测试[谓语]

轴(axis)
    定义所选节点与当前节点之间的树关系
节点测试(node-test)
    识别某个轴内部的节点
零个或者更多谓语(predicate)
    更深入地提炼所选的节点集 

实例:

child::book         选取所有属于当前节点的子元素的 book 节点。
attribute::lang         选取当前节点的 lang 属性。
child::*         选取当前节点的所有子元素。
attribute::*         选取当前节点的所有属性。
child::text()         选取当前节点的所有文本子节点。
child::node()         选取当前节点的所有子节点。
descendant::book         选取当前节点的所有 book 后代。
ancestor::book         选择当前节点的所有 book 先辈。
ancestor-or-self::book         选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price         选取当前节点的所有 price 孙节点。

运算符

XPath 表达式可返回节点集、字符串、逻辑值以及数字。

实例

所有现代浏览器都支持使用 XMLHttpRequest 来加载 XML 文档的方法。

针对大多数现代浏览器的代码:

var xmlhttp=new XMLHttpRequest()

针对古老的微软浏览器(IE 5 和 6)的代码:

var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")

选取节点

不幸的是,Internet Explorer 和其他处理 XPath 的方式不同。

在我们的例子中,包含适用于大多数主流浏览器的代码。

Internet Explorer 使用 selectNodes() 方法从 XML 文档中的选取节点:

xmlDoc.selectNodes(xpath);

Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:

xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);

完整例子:

<html>
<body>
<script type="text/javascript">
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else
  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}

xml=loadXMLDoc("/example/xmle/books.xml");
path="/bookstore/book/title"
// code for IE
if (window.ActiveXObject)
{
var nodes=xml.selectNodes(path);

for (i=0;i<nodes.length;i++)
  {
  document.write(nodes[i].childNodes[0].nodeValue);
  document.write("<br />");
  }
}
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
var result=nodes.iterateNext();

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

</body>
</html>
文章目录
  1. 1. XML实例文档
  2. 2. 节点
    1. 2.1. 基本值(原子值)
    2. 2.2. 项目
    3. 2.3. 节点关系
  3. 3. 语法
    1. 3.1. 选取节点
    2. 3.2. 谓语
    3. 3.3. 选取未知节点
    4. 3.4. 选取若干路径
  4. 4.
    1. 4.1. 位置路径表达式
    2. 4.2.
  5. 5. 运算符
  6. 6. 实例
    1. 6.1. 选取节点