XPath

Xpath作用,四大类。

检索XML文件中的信息 绝对路径:

/根元素/子元素/孙元素 相对路径:

./子元素/孙元素

全文检索://contact

属性查找://@属性名 、//元素[@属性名]、//元素//[@属性名=‘值’]

 

引入:
Dom4J可以用于解析整个XML的数据。
但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
Dom4J用于解析数据,Xpath用于检索数据。
XPath使用步骤:
1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
2.导入XPath独有的框架包。jaxen-1.1.2.jar
XPath常用API:
List<Node> selectNodes(String var1):检索出一批节点集合。
Node selectSingleNode(String var1):检索出一个节点返回。
XPath提供的四种检索数据的写法:
1.绝对路径。
2.相对路径。
3.全文搜索。
4.属性查找。
小结:
1.绝对路径: /根元素/子元素/子元素。
2.相对路径: ./子元素/子元素。 (.代表了当前元素)
3.全文搜索:
//元素 在全文找这个元素
//元素1/元素2 在全文找元素1下面的一级元素2
//元素1//元素2 在全文找元素1下面的全部元素2
4.属性查找。
//@属性名称 在全文检索属性对象。
//元素[@属性名称] 在全文检索包含该属性的元素对象。
//元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
public class XPathDemo {
/**
1.绝对路径: /根元素/子元素/子元素。
*/
@Test
public void parse01() throws Exception {
//a.创建解析器对象
SAXReader saxReader = new SAXReader();
//b.把XML加载成Document对象
Document document = saxReader.read(saxReader.getClass().getResourceAsStream("/Contacts2.xml"));
//c.检索全部的名称
List<Node> nameEles = document.selectNodes("/contactList/contact/name");
for (Node nameNode :nameEles) {
Element nameEle = (Element) nameNode; //将节点类型转为元素类型(可以转有继承关系API)
System.out.println(nameEle.getTextTrim());
}


}

/**2.相对路径: ./子元素/子元素。 (.代表了当前元素)
*/
@Test
public void parse02() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document = saxReader.read(saxReader.getClass().getResourceAsStream("/Contacts2.xml"));
Element root = document.getRootElement();
//检索全部名称
List<Node> nameEles = root.selectNodes("./contact/name");//起点为根元素
for (Node nameNode :nameEles) {
Element nameEle = (Element) nameNode; //将节点类型转为元素类型(可以转有继承关系API)
System.out.println(nameEle.getTextTrim());
}
}

/**
3.全文搜索:
//元素 在全文找这个元素
//元素1/元素2 在全文找元素1下面的一级元素2
//元素1//元素2 在全文找元素1下面的全部元素2
*/
@Test
public void parse03() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));

// c.检索数据
//List<Node> nameNodes = document.selectNodes("//name");//查询所有name有西门庆
List<Node> nameNodes = document.selectNodes("//contact/name");//支找contact下的name没有西门庆
for (Node nameNode :nameNodes) {
Element nameEle = (Element) nameNode; //将节点类型转为元素类型(可以转有继承关系API)
System.out.println(nameEle.getTextTrim());
}
}

/**
4.属性查找。
//@属性名称 在全文检索属性对象。
//元素[@属性名称] 在全文检索包含该属性的元素对象。
//元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
@Test
public void parse04() throws Exception {
// a、创建解析器对象
SAXReader saxReader = new SAXReader();
// b、把XML加载成Document文档对象
Document document =
saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
// c.检索数据
List<Node> nodes = document.selectNodes("//@id");
for (Node node :nodes) {
Attribute attribute = (Attribute) node;
System.out.println(attribute.getName()+"-->"+attribute.getValue());
}

//查询name元素(包含id属性的)
//List<Node> nodes1 = document.selectNodes("//name[@id]");//寻找name中包含id属性
Node node = document.selectSingleNode("//name[@id]");//一个节点姐
Element ele = (Element)node;
System.out.println(ele.getTextTrim());

//精准定位某个元素
Node node2 = document.selectSingleNode("//name[@id=888]");
}


<?xml version="1.0" encoding="UTF-8"?>
<contactList>
<contact id="1" vip="true">
<name> 潘金莲 </name>
<gender>女</gender>
<email>panpan@itcast.cn</email>
</contact>
<contact id="2" vip="false">
<name>武松</name>
<gender>男</gender>
<email>wusong@itcast.cn</email>
</contact>
<contact id="3" vip="false">
<name>武大狼</name>
<gender>男</gender>
<email>wuda@itcast.cn</email>
</contact>
<user>
<contact>
<info>

<name>我是西门庆</name>
</info>
</contact>
</user>
</contactList>

posted on 2022-04-06 15:44  我要当程序源  阅读(139)  评论(0编辑  收藏  举报

导航