更新时间:2020-12-09 17:22:01 来源:极悦 浏览1388次
XPath,全称 XML Path Language,即 XML 路径语言,它是一门在XML文档中查找信息的语言。XPath最初设计是用来搜寻XML文档的,这是因为XML表述了一种树状结构,而XPath作为一种小型的查询语言能够根据XML结构树在树中寻找节点。因此,XPATH解析XML文件也是手到擒来。
XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式,另外它还提供了超过 100 个内建函数用于字符串、数值、时间的匹配以及节点、序列的处理等等,几乎所有我们想要定位的节点都可以用XPath来选择。XPath 于 1999 年 11 月 16 日 成为 W3C 标准,它被设计为供 XSLT、XPointer 以及其他 XML 解析软件使用,XPath定义了一组语法,能够从结构树中筛选出满足要求的节点。
我们现用一个实例来感受一下使用 XPath解析 XML文件解析的过程,代码如下:
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class TestXPath {
public static void main(String[] args) throws DocumentException {
//1 创建SAXReader对象
SAXReader reader = new SAXReader();
//2 读XML文件
Document doc = reader.read("web/book.xml");
//得到第一个author节点
Node node = doc.selectSingleNode("//author");
System.out.println("节点的名称:" + node.getName() + "\t" + node.getText());
//得到所有author节点
List<Node> nodeList = doc.selectNodes("//author");
for (Iterator<Node> iBook = nodeList.iterator();iBook.hasNext();) {
Node n = iBook.next();
System.out.println("节点的名称:" + n.getName() + "\t" + n.getText());
}
List<Node> nameList = doc.selectNodes("//name");
for (Iterator<Node> iBook = nameList.iterator();iBook.hasNext();) {
Node n = iBook.next();
System.out.println("节点的名称:" + n.getName() + "\t" + n.getText());
}
}
}
在这里我们首先导入了 LXML 库的 etree 模块,然后声明了一段 XML文本,调用 XML 类进行初始化,这样我们就成功构造了一个 XPath 解析对象,在这里注意到XML文本中的最后一个 li 节点是没有闭合的,但是 etree 模块可以对XML文本进行自动修正。
我们一般会用 // 开头的 XPath 规则来选取所有符合要求的节点,以上文的XML文本为例,如果我们要选取所有节点,可以这样实现:from lxml import etree
xml= etree.parse('./testxml', etree.XMLParser())
result =xml.xpath('//*')
print(result)
运行结果:
[<Element xml at 0x10510d9c8>, <Element body at 0x10510da08>, <Element div at 0x10510da48>, <Element ul at 0x10510da88>, <Element li at 0x10510dac8>, <Element a at 0x10510db48>, <Element li at 0x10510db88>, <Element a at 0x10510dbc8>, <Element li at 0x10510dc08>, <Element a at 0x10510db08>, <Element li at 0x10510dc48>, <Element a at 0x10510dc88>, <Element li at 0x10510dcc8>, <Element a at 0x10510dd08>]
我们在这里使用 * 代表匹配所有节点,也就是整个XML文本中的所有节点都会被获取,可以看到返回形式是一个列表,每个元素是 Element 类型,其后跟了节点的名称,如 xml、body、div、ul、li、a 等等,所有的节点都包含在列表中了。当然此处匹配也可以指定节点名称,如果我们想获取所有 li 节点,示例如下:
from lxml import etree
html = etree.parse('./test.html', etree.XMLParser())
result = xml.xpath('//li')
print(result)
print(result[0])
在这里我们要选取所有 li 节点可以使用 //,然后直接加上节点的名称即可,调用时直接调用 xpath() 方法即可提取。运行结果:[<Element li at 0x105849208>, <Element li at 0x105849248>, <Element li at 0x105849288>, <Element li at 0x1058492c8>, <Element li at 0x105849308>]
<Element li at 0x105849208>
在这里我们可以看到提取结果是一个列表形式,其每一个元素都是一个 Element 对象,如果要取出其中一个对象可以直接用中括号加索引即可取出,如 [0]。
javax.xml.xpath包提供了强大的XPath解析功能,因此我们可以基于它实现XML的解析。XPathParser类中封装了“javax.xml.xpath.XPath”类的对象。我们已经知道XPath对象是XML解析的利器,因此XPathParser类便具有了XML解析的能力。
下面代码给出了XPathParser类的带注释的属性。// 代表要解析的整个XML文档
private final Document document;
// 是否开启验证
private boolean validation;
// EntityResolver,通过它可以声明寻找DTD文件的方法,例如通过本地寻找,而不是只能通过网络下载DTD文件
private EntityResolver entityResolver;
// MyBatis配置文件中的properties节点的信息
private Properties variables;
// javax.xml.xpath.XPath工具
private XPath xpath;
有必要说明一下,上述“private Properties variables”属性存储的内容就是MyBatis配置文件中properties节点的信息。properties节点会在解析配置文件的最开始就被解析,然后相关信息会被放入“private Properties variables”属性并在解析后续节点时发挥作用。
实际上,你不要以为XPath解析XML文件是专属,相反同样适用于解析HTML文件,而且XPath在做爬虫时对信息的抽取能力也是十分出众的。想深入学习XPath的小伙伴,可以在本站的XML教程中找到XPath的更多知识。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习