mybatis学习笔记之java的XPath介绍及使用

这篇博客介绍了XPath的使用,包括如何通过XPath与DOM解析XML文件,提供了常见路径表达式的解释,并展示了如何在Java中操作XPath来获取节点信息,如获取属性、文本节点、满足特定条件的节点等。
摘要由CSDN通过智能技术生成

XPath简介

XPath是jdk1.5提供的,与DOM解析方式搭配,解析XML文件。XPath使用路径表达式来获取XML文件指定的节点或节点集合,常见的路径表达式见下表:

表达式表达式含义
/从根节点选取指定节点
//选择文档中的任意节点,而不考虑它们的位置
.选取当前节点
选取父节点
@选取属性
*匹配任意节点
@*选取任意属性
node()匹配任意节点
text()匹配文本节点
|或语法,匹配多个节点
[]指定条件,例如属性[@name=‘zs’],[last()]、[position() < 2]

XPath用法

1、先准备一份XML文件

<users>
    <user name="zs" age="18">
        <height>180</height>
        <weight>140</weight>
        <hobby>basketball</hobby>
    </user>
    <user name="ls" age="17">
        <height>160</height>
        <weight>160</weight>
        <hobby>basketball</hobby>
    </user>
</users>

2、创建Document对象

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//以下几个属性可以不用写采用默认值
documentBuilderFactory.setValidating(false);
documentBuilderFactory.setNamespaceAware(false);
documentBuilderFactory.setIgnoringComments(true);
documentBuilderFactory.setIgnoringElementContentWhitespace(false);
documentBuilderFactory.setCoalescing(false);

documentBuilderFactory.setExpandEntityReferences(true);
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
//所要解析的xml文件的位置
Document doc = builder.parse("users.xml");

3、创建XPath对象

XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();

4、解析XML文件
先介绍下XPathConstants对象的几个常量

1.NUMBER 映射到java的Double类型
2.STRING 映射到java的String类型
3.BOOLEAN 映射到java的Boolean类型
4.NODESET 映射到org.w3c.dom.NodeList类型
5.NODE 映射到org.w3c.dom.Node类型

//第一个参数为表达式,第二个为Document,第三个为所要解析的类型
//1、获取第一个user节点下height节点的文本节点
String height = (String) xPath.evaluate("//user/height/text()", doc,XPathConstants.STRING);
//2、获取所有height节点的文本节点
NodeList nodeLists = (NodeList) xPath.evaluate("//user/height/text()", doc,XPathConstants.NODESET);
for (int i = 0; i < nodeLists.getLength(); i++) {
    System.out.println(nodeLists.item(i).getNodeValue());
}
//3、获取name属性为zs的第一个user节点,要获取所有,第三个参数改为XPathConstants.NODESET 
Node node = (Node) xPath.evaluate("//user[@name='zs']", doc,XPathConstants.NODE);
//4、获取age < 18 的第一个user节点,要获取所有,第三个参数改为XPathConstants.NODESET 
Node node = (Node) xPath.evaluate("//user[@age<18]", doc,XPathConstants.NODE);
//5、获取第一个user节点
Node node = (Node) xPath.evaluate("//user[1]", doc,XPathConstants.NODE);
//6、获取最后一个user节点,也可以用last()减去一个数值: last() - 1
Node node = (Node) xPath.evaluate("//user[last()]", doc,XPathConstants.NODE);

Node类型也有很多种,具体参见Node类中的常量

JsoupXpath 是一款纯Java开发的使用xpath解析html的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath.为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发了JsoupXpath。JsoupXpath的实现逻辑清晰,扩展方便,支持几乎全部常用的xpath语法.http://www.cnblogs.com/ 为例 "//a/@href"; "//div[@id='paging_block']/div/a[text()='Next >']/@href"; "//div[@id='paging_block']/div/a[text()*='Next']/@href"; "//h1/text()"; "//h1/allText()"; "//h1//text()"; "//div/a"; "//div[@id='post_list']/div[position()1000]/div/h3/allText()"; //轴支持 "//div[@id='post_list']/div[self::div/div/div/span[@class='article_view']/a/num()>1000]/div/h3/allText()"; "//div[@id='post_list']/div[2]/div/p/preceding-sibling::h3/allText()"; "//div[@id='post_list']/div[2]/div/p/preceding-sibling::h3/allText()|//div[@id='post_list']/div[1]/div/h3/allText()"; 在这里暂不列出框架间的对比了,但我相信,你们用了会发现JsoupXpath就是目前市面上最强大的的Xpath解析器。 快速开始 如果不方便使用maven,可以直接使用lib下的依赖包跑起来试试,如方便可直接使用如下dependency(已经上传至中央maven库,最新版本0.1.1):    cn.wanghaomiao    JsoupXpath    0.1.1 依赖配置好后,就可以使用如下例子进行体验了!String xpath="//div[@id='post_list']/div[./div/div/span[@class='article_view']/a/num()>1000]/div/h3/allText()";String doc = "..."; JXDocument jxDocument = new JXDocument(doc); List<Object> rs = jxDocument.sel(xpath); for (Object o:rs){     if (o instanceof Element){             int index = ((Element) o).siblingIndex();             System.out.println(index);     }     System.out.println(o.toString()); } 其他可以参考 cn.wanghaomiao.example包下的例子 语法 支持标准xpath语法(支持谓语嵌套),支持全部常用函数,支持全部常用轴,去掉了一些标准里面华而不实的函数和轴,下面会具体介绍。语法可以参考http://www.w3school.com.cn/xpath/index.asp 关于使用Xpath的一些注意事项 非常不建议直接粘贴Firefox或chrome里生成的Xpa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值