XPath 是一门在 XML 文档中查找信息的语言。
基础信息
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点,节点之间的关系有以下几种:
- 父(Parent):每个元素以及属性都有一个父
- 子(Children):元素节点可有零个、一个或多个子
- 同胞(Sibling):拥有相同的父的节点
- 先辈(Ancestor):某节点的父、父的父,等等。
- 后代(Descendant):某个节点的子,子的子,等等
XPath语法:
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径 (path) 或者步 (steps) 来选取的,以下面books.xml为例,描述xpath语法。
<?xml version="1.0" encoding="UTF-8"?>
<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 来选取的。 下面列出了最有用的路径表达式,右边两列列出了一些路径表达式以及表达式的结果
-
谓语(Predicates):谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
-
选取未知节点:XPath 通配符可用来选取未知的 XML 元素
-
选取若干路径:通过在路径表达式中使用"|"运算符,可以选取若干个路径。在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果
实例代码
-
新建一个python项目
-
在项目下新建
books.xml
文件,作为等会处理的文件<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="HTML"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="PYTHON"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="JAVA"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
-
在项目下新建一个
xpath.html
文件,编写代码解析books.xml。
代码如下:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> /*定义一个函数用来加载xml文档*/ function loadXMLDoc(dname) { if (window.XMLHttpRequest) { xhttp = new XMLHttpRequest();//获取XMLHttpRequest对象 } else { xhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET",dname,false); xhttp.send(""); return xhttp.responseXML; } xml = loadXMLDoc("books.xml"); /* 信息的位置 path = "/bookstore/book/title"//选取所有title还可以这样写:path="//title[@lang='en']" path="/bookstore/book[1]/title" //选取第一个 book 的 title path ="/bookstore/book/price/text()" //选取所有价格 path = "/bookstore/book[price>35]/price" //选取价格高于 35 的 price 节点 path = "//author" //选取作者 path = "//year" //选取年份 */ path = "//price"; if(window.ActiveXObject){ /*xmlDoc.selectNodes(xpath);从XML文档中选取节点*/ var nodes = xml.selectNodes(path); for (i = 0; i<nodes.length;i++){ document.write(nodes[i].childNodes[0].nodeValue); document.write("<br>"); } } else if (document.implementation && document.implementation.createDocument) { /*Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:*/ 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(result.nodeValue); //选取所有价格对应的处理 document.write("<br>"); result = nodes.iterateNext(); } } </script> </head> <body> </body> </html>
代码分析:
-
现代浏览器都支持使用 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);
loadXML()
用来加载xml文档
运行程序
将鼠标放到pycharm 界面的右上角,会出现:
选择你想要打开的浏览器,结果如下;