package com.czie.d2_xpath;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
/**
* 目标:XPath检索XML中的信息啊。(了解)
* <p>
* 引入:
* 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(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
//c.检索全部的名称
List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element) nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
* 2.相对路径: ./子元素/子元素。 (.代表了当前元素)
*/
@Test
public void parse02() throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
Element rootElement = document.getRootElement();
List<Node> nameNodes = rootElement.selectNodes("./contact/name");
for (Node nameNode : nameNodes) {
Element element = (Element) nameNode;
System.out.println(element.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("//contact//name");
for (Node nameNode : nameNodes) {
Element element = (Element) nameNode;
System.out.println(element.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属性的
//Node node = document.selectSingleNode("//name[@id]");
Node node = document.selectSingleNode("//name[@id=666]");
Element element=(Element) node;
System.out.println(element.getTextTrim());//我是西门庆
}
}
<?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 id="666">我是西门庆</name>
</info>
</contact>
</user>
</contactList>
