XML文件的数据检索技术:XPath

这篇博客详细介绍了如何使用XPath在Java中解析XML数据。通过Dom4j库和XPath技术,演示了四种主要的XPath表达式:绝对路径、相对路径、全文搜索和属性查找,分别用于获取XML文档中的特定节点和属性信息。示例代码展示了如何从XML文件中检索联系人列表的姓名和ID属性。
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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值