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>

 

posted @ 2022-04-29 11:25  刘品水  阅读(97)  评论(0编辑  收藏  举报