XML文件的数据检索技术:XPath
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>