`

XPath 实例(w3school)

    博客分类:
  • XML
阅读更多

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

XML 实例文档

我们将在下面的例子中使用这个 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 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式

描述

nodename

选取标签名为 nodename的所有 节点的集合

/

从根节点开始搜索

// nodename

从根节点开始搜索名为 nodename的所有节点的集合 ,而不考虑它们的位置(即深度)

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

 

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式

结果

bookstore

从当前节点开始(上下文节点)选取 名为 bookstore 所有节点的集合

/bookstore

从根开始选取 名为 bookstore 所有节点的集合

 

注释:假如路径起始于正斜杠 ( / ) ,则此路径始终代表到某元素的绝对路径!

bookstore/book

选取所有属于 bookstore 的子元素的 book 元素集合。

//book

选取所有 book 子元素集合,而不管它们在文档中的位置。

bookstore//book

选择所有属于 bookstore 元素的后代的 book 元素集合,而不管它们位于 bookstore 之下的什么位置。

//@lang

选取所有名为 lang 的属性集合。

 

<script type="text/javascript" src="detect.js"></script>
<script type="text/javascript" src="xmldom.js"></script>
<script type="text/javascript">
if (isMoz) {
	Element.prototype.selectNodes = function (sXPath) {
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, this,
		 null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		var aNodes = new Array;
		if (oResult != null) {
			var oElement = oResult.iterateNext();
			while (oElement) {
				aNodes.push(oElement);
				oElement = oResult.iterateNext();
			}
		}
		return aNodes;
	};
	Document.prototype.selectNodes = Element.prototype.selectNodes;
	Element.prototype.selectSingleNode = function (sXPath) {
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, this,
		 null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (oResult != null) {
			return oResult.singleNodeValue;
		} else {
			return null;
		}
	};
	Document.prototype.selectSingleNode = Element.prototype.selectSingleNode;
}
var oXmlDom = new XmlDom();
oXmlDom.onreadystatechange = function () {
	if (oXmlDom.readyState == 4 || (oXmlDom.getReadyState && oXmlDom.getReadyState() == 4)) {
			//如果解释XML出错
		if (oXmlDom.parseError != 0) {
				//Mozilla
			if (oXmlDom.getReadyState) {
				alert(oXmlDom.xml);
			} else {//IE
				var oError = oXmlDom.parseError;
				alert("An error occurred:\nError Code: " + oError.errorCode + "\n" 
				+ "Line: " + oError.line + "\n" 
				+ "Line Pos: " + oError.linepos + "\n"
				+ "Reason: " + oError.reason);
			}
		} else {
			//do somethins ...
			alert("------------XPath = bookstore--------------");
			/*oXmlDom为XML DOM,这里的上下文就是文档,这里的 XPath表达式bookstore
				意思就是选择文档中bookstore元素,即根节点*/
			var lstNodes = oXmlDom.selectNodes("bookstore");
			alert(lstNodes.length);//1
			for (var i = 0; i < lstNodes.length; i++) {
						//bookstore
				alert(lstNodes[i].tagName);
			}
			
			alert("------------XPath = /bookstore--------------");
			/*oXmlDom.documentElement为文档的根元素,即这里的上下文节点是文档的根节点,
				但XPath还是能正确的运行,因为以反杠开前的不绝对路径,与上下文本节点就没有
				关第了,所以与上面的结果是一样的*/
			lstNodes = oXmlDom.documentElement.selectNodes("/bookstore");
			alert(lstNodes.length);//1
			for (var i = 0; i < lstNodes.length; i++) {
						//bookstore
				alert(lstNodes[i].tagName);
			}
			
			alert("------------XPath = bookstore/book--------------");
			lstNodes = oXmlDom.selectNodes("bookstore/book");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//获取每个book节点的价格				
				alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
			}
			
			alert("------------XPath = //book--------------");
			//oXmlDom.documentElement.为根元素
			lstNodes = oXmlDom.documentElement.selectNodes("//book");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {				    
				//获取每个book节点的价格				
				alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
			}
			
			alert("------------XPath = bookstore//book--------------");
			lstNodes = oXmlDom.selectNodes("bookstore//book");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//获取每个book节点的价格				
				alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
			}
			
			alert("------------XPath = //@lang--------------");
			//返回命为lang的所有属性节点集合
			lstNodes = oXmlDom.selectNodes("//@lang");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次打印: lang = eng
				//第二次打印: lang = eng
				alert(lstNodes[i].nodeName + " = " + lstNodes[i].nodeValue);
			}
		}
	}
};
oXmlDom.load("test.xml");
</script>

 

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

 

路径表达式

结果

/bookstore/book[1]

选取属于 bookstore  元素的第一个 book 子元素。

/bookstore/book[last()]

选取属于 bookstore  元素的最后一个 book 子 元素。

/bookstore/book[last()-1]

选取属于 bookstore  元素的倒数第二个 book 子元素。

/bookstore/book[position()<3]

选取最前面的两个属于 bookstore 元素的 book 子元素。

//title[@lang]

选取所有拥有名为 lang 的属性的 title 元素。

//title[@lang='eng']

选取所有 title 元素,且这些元素拥有值为 eng lang 属性。

/bookstore/book[price>35.00]

选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00

/bookstore/book[price>35.00]/title

选取所有 bookstore 元素中的 book 元素的 title 子元素,且其中的 price 元素的值须大于 35.00

 

<script type="text/javascript" src="detect.js"></script>
<script type="text/javascript" src="xmldom.js"></script>
<script type="text/javascript">

if (isMoz) {
	Element.prototype.selectNodes = function (sXPath) {
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, this, null, 
		XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		var aNodes = new Array;
		if (oResult != null) {
			var oElement = oResult.iterateNext();
			while (oElement) {
				aNodes.push(oElement);
				oElement = oResult.iterateNext();
			}
		}
		return aNodes;
	};
	Document.prototype.selectNodes = Element.prototype.selectNodes;
	Element.prototype.selectSingleNode = function (sXPath) {
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, this, null, 
		XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (oResult != null) {
			return oResult.singleNodeValue;
		} else {
			return null;
		}
	};
	Document.prototype.selectSingleNode = Element.prototype.selectSingleNode;
}

var oXmlDom = new XmlDom();
oXmlDom.onreadystatechange = function () {
	if (oXmlDom.readyState == 4 || (oXmlDom.getReadyState && oXmlDom.getReadyState() == 4)) {
		//如果解释XML出错
		if (oXmlDom.parseError != 0) {
			//Mozilla
			if (oXmlDom.getReadyState) {
				alert(oXmlDom.xml);
			} else {//IE
				var oError = oXmlDom.parseError;
				alert("An error occurred:\nError Code: " + oError.errorCode + "\n" 
				+ "Line: " + oError.line + "\n" 
				+ "Line Pos: " + oError.linepos + "\n" 
				+ "Reason: " + oError.reason);
			}
		} else {
			//do somethins ...
			alert("------------XPath = /bookstore/book[1]--------------");
			//选取属于  bookstore 元素的第一个  book 子元素。 
			var lstNodes = oXmlDom.selectSingleNode("/bookstore/book[1]");
			//获取每个book节点的价格	29.99
			alert(lstNodes.selectSingleNode("price").firstChild.nodeValue);
			
			alert("------------XPath = /bookstore/book[last()]-------------");
			//选取属于  bookstore 元素的最后一个  book 子 元素。  
			lstNodes = oXmlDom.selectSingleNode("/bookstore/book[last()]");
			//获取每个book节点的价格	39.95
			alert(lstNodes.selectSingleNode("price").firstChild.nodeValue);
			
			alert("------------XPath = /bookstore/book[last()-1]-------------");
			//选取属于  bookstore 元素的倒数第二个  book 子元素。 
			lstNodes = oXmlDom.selectSingleNode("/bookstore/book[last()-1]");
			//获取每个book节点的价格	29.99
			alert(lstNodes.selectSingleNode("price").firstChild.nodeValue);
			
			alert("------------XPath = /bookstore/book[position()<3]-------------");
			//选取最前面的两个属于  bookstore 元素的  book 子元素。
			lstNodes = oXmlDom.selectNodes("/bookstore/book[position()<3]");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次输出:29.99
				//第二次输出:39.95
				alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
			}
			
			alert("------------XPath = //title[@lang]-------------");
			//选取所有拥有名为  lang 的属性的  title 元素。 
			lstNodes = oXmlDom.selectNodes("//title[@lang]");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次输出:Harry Potter
				//第二次输出:Learning XML
				alert(lstNodes[i].firstChild.nodeValue);
			}
			
			alert("------------XPath = //title[@lang='eng']-------------");
			//选取所有  title 元素,且这些元素拥有值为  eng 的  lang 属性。 
			lstNodes = oXmlDom.selectNodes("//title[@lang='eng']");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次输出:Harry Potter
				//第二次输出:Learning XML
				alert(lstNodes[i].firstChild.nodeValue);
			}
			
			alert("------------XPath = /bookstore/book[price>35.00]-------------");
			//选取所有bookstore元素的book元素,且其中的price元素的值须大于35.00 
			lstNodes = oXmlDom.selectNodes("/bookstore/book[price>35.00]");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次输出:39.95
				alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
			}
			
			alert("-------XPath = /bookstore/book[price>35.00]/title---------");
			//选取所有bookstore元素中的book元素的title 元素且其中的price元素的值须大于35.00 
			lstNodes = oXmlDom.selectNodes("/bookstore/book[price>35.00]/title");
			alert(lstNodes.length);//2
			for (var i = 0; i < lstNodes.length; i++) {
				//第一次输出:Learning XML
				alert(lstNodes[i].firstChild.nodeValue);
			}
		}
	}
};
oXmlDom.load("test.xml");
</script>

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符

描述

*

匹配任何元素节点

@*

匹配任何属性节点

node()

匹配任何类型的节点

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式

结果

/bookstore/*

选取 bookstore 元素的所有子节点

//*

选取文档中的所有元素

//title[@*]

选取所有带有属性的 title 元素。

 

alert("------------XPath = /bookstore/*-------------");
//选取bookstore元素的所有子节点
var lstNodes = oXmlDom.selectNodes("/bookstore/*");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次输出:29.99
	//第二次输出:39.95
	alert(lstNodes[i].selectNodes("price")[0].firstChild.nodeValue);
}
alert("------------XPath = //*-------------");
//选取文档中的所有元素
lstNodes = oXmlDom.selectNodes("//*");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次:bookstore
	//第二次:book
	//第三次:title
	//第四次:price
	//第五次:book
	//第六次:title
	//第七次:price
	alert(lstNodes[i].tagName);
}
alert("------------XPath = //title[@*]-------------");
//选取所有带有属性的title 元素
lstNodes = oXmlDom.selectNodes("//title[@*]");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次:Harry Potter
	//第二次:Learning XML			
	alert(lstNodes[i].firstChild.nodeValue);
}
 

选取若干路径

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

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式

结果

//book/title|//book/price

选取所有 book 元素的 title price 元素。

//title|//price

选取所有文档中的 title price 元素。

/bookstore/book/title|//price

选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

 

alert("------------XPath = //book/title|//book/price-------------");
//选取所有book元素的title和price 元素
var lstNodes = oXmlDom.selectNodes("//book/title|//book/price");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次:title
	//第二次:price
	//第三次:title
	//第四次:price
	alert(lstNodes[i].tagName);
}
alert("------------XPath = //title|//price-------------");
//选取所有文档中的title和price元素
lstNodes = oXmlDom.selectNodes("//title|//price");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次:title
	//第二次:price
	//第三次:title
	//第四次:price
	alert(lstNodes[i].tagName);
}
alert("------------XPath = /bookstore/book/title|//price-------------");
//选取所有属于bookstore元素的book元素的title 元素,以及文档中所有的price元素
lstNodes = oXmlDom.selectNodes("/bookstore/book/title|//price");
alert(lstNodes.length);//2
for (var i = 0; i < lstNodes.length; i++) {
	//第一次:title
	//第二次:price
	//第三次:title
	//第四次:price
	alert(lstNodes[i].tagName);
}

分享到:
评论

相关推荐

    W3School离线手册中文版(web前端)

    W3School离线手册中的实例测试工具,允许开发者在本地环境下直接尝试代码示例,快速验证和理解所学概念,提升学习效率。 通过这个离线手册,无论是Web开发新手还是专业人士,都可以在没有网络的情况下,随时随地...

    W3School全套教程

    W3School 的教程结构清晰,实例丰富,是初学者入门和专业人士提升技能的理想资源。 **HTML教程** HTML(超文本标记语言)是网页制作的基础,W3School 提供的HTML教程包括了从基础语法到高级特性的全方位讲解。学习...

    w3school chm

    在w3school,我们提供上千个实例。 通过使用我们的在线编辑器,你可以编辑这些例子,并对代码进行实验。 快捷易懂的学习方式 一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容。 在这里,您可以通过...

    W3School离线手册(2015.07.17)

    《W3School离线手册(2015.07.17)》是一个非常实用的资源,包含了关于Web开发核心语言的详细指南,包括HTML、CSS、...W3School提供的教程以其清晰的结构和丰富的实例,成为许多Web开发者学习和提升技能的重要资源。

    w3school学习手册

    【w3school学习手册】是IT领域非常知名的在线学习资源,尤其在Web开发技术方面具有广泛影响力。这个压缩包文件包含的是2012年4月27日更新的W3CSchool全套教程,其中主要涵盖了HTML、XML以及HTML5等核心技术的学习...

    W3school.chm

    在w3school,我们提供上千个实例。 通过使用我们的在线编辑器,你可以编辑这些例子,并对代码进行实验。 快捷易懂的学习方式 一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容。 在这里,您可以通过一种...

    w3school最新版11.12.6.chm

    最新版w3school帮助文档,集成了最新的jQuery 高压缩 只有不足6M的文件 包含的技术有: HTML教程 HTML XHTML CSS TCP/IP XML教程 XML DTD XML DOM XSL XSLT XSL-FO XPath XQuery XLink XPointer ...

    w3school离线手册2019版

    《w3school离线手册2019版》是一款针对前端开发者的重要学习资源,它集成了w3school网站上的各种Web技术教程,包括HTML、CSS、JavaScript、jQuery、Ajax、XML等众多关键领域的知识。这款手册以其详尽的文档、丰富的...

    w3school中文整站 完全版

    【描述】提到“这次补全了 比较大”,意味着这个压缩包包含了w3school网站的所有中文教程内容,内容量丰富,可能包含了大量的实例、参考文档和练习,旨在为学习者提供一个完整的自学环境。 【标签】中的"CSS"是指...

    w3school chm最新版2013年3月编译w3c

    《w3school chm最新版2013年3月编译w3c》是针对web开发者和学习者的一款重要资源库,它包含了2013年3月30日更新的w3school.com.cn的离线版本。这个CHM(Compiled Help Manual)文件为用户提供了丰富的Web技术知识,...

    W3school. 最新版离线api

    通过W3School的离线API,开发者不仅可以深入理解这些技术,还可以通过实例和在线编译器进行实践操作,从而快速提升技能水平。无论你是初学者还是经验丰富的开发者,这个离线工具都能成为你宝贵的参考资料。

    W3school_20100923.chm

    WSDL W3C 术语表 RDF 字符集 RSS HTML 字符集 WAP HTML ASCII Web Services HTML ISO-8859-1 浏览器脚本 HTML 符号 JavaScript 实例/案例 HTML DOM HTML 实例 DHTML CSS 实例 VBScript ...

    W3School教程.rar

    W3School教程会教你如何编写有效的XML文档,以及如何使用XPath和XSLT处理XML数据。 JavaScript是一种强大的客户端脚本语言,用于增加网页的交互性。在JavaScript部分,教程将覆盖变量、数据类型、控制流、函数、...

    W3Schools.com 20091022 英文版整站教程 参考和实例 毛哥打包

    绝对的精品,手头必备,英文版W3School.com 20091022整站克隆,去广告,保留动手实验。 另,中文版网络上已有人制作完成,请自行搜索。 教程参考及实例包含以下技术内容: 1.HTML,XHTML,CSS,TCP/IP 2.JavaScript,...

    W3school CHM 2011.03 最新版

    XPath XQuery XLink XPointer DTD Schema XML DOM XForms SOAP WSDL RDF RSS WAP Web Services 浏览器脚本 JavaScript HTML DOM DHTML VBScript AJAX E4X WMLScript 服务器脚本 SQL ASP ADO PHP .NET(dotnet) .NET ...

    XSL的W3School教程.rar

    W3School的XSL教程提供了丰富的资源,包括实例、练习和参考指南,帮助初学者快速掌握XSL的使用。通过这个教程,你可以了解如何创建XSL样式表,使用XPath选择XML节点,以及如何利用XSL-FO来设计文档的外观。 在学习...

    xpath语法与函数

    此外,可以参考W3School提供的完整XPath 2.0、XQuery 1.0和XSLT 2.0的内置函数参考手册,以便深入学习和实践。 #### 总结 XPath作为一种强大的查询语言,在XML文档处理中扮演着极其重要的角色。无论是简单的数据...

    xpath文件

    其中,CHM格式的“W3School离线手册(2015.07.17).chm”是Web技术学习者熟悉的参考材料。尽管它涵盖的技术范围广泛,但作为编程学习平台的权威出品,肯定包括了关于XPath的章节,其中可能包含XPath的基本概念、基本...

    w3sch0ol全站压缩chm

    《w3school全站压缩chm》是2010年9月23日更新的资源,包含了当时w3school网站的全部学习内容。w3school是一个全球知名的在线Web技术教程平台,它提供了丰富的Web开发、设计和编程教程,涵盖了HTML、CSS、JavaScript...

Global site tag (gtag.js) - Google Analytics