专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 XPATH解析XML文件实例

XPATH解析XML文件实例

更新时间:2020-12-09 17:22:01 来源:动力节点 浏览1298次

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的更多知识。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>