使用dom4j + XPath 解析XML

1、导入依赖

<!--解析xml文件依赖-->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

        <!--dom4j集成XPath&#45;&#45;XPth可以使用路径表达式来选取XML文档中的元素或者属性节点,节点是沿着路径来选取的。-->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>

2、步骤解析

使用dom4j解析user.xml

步骤

1.创建解析器对象
2.使用解析器对象读取XML文档生成Document对象
3.根据Document对象获取XML的元素(标签)信息

3、常用方法

getQName()

元素的QName对象

getNamespace()

元素所属的Namespace对象

getNamespacePrefix()

元素所属的Namespace对象的prefix

getNamespaceURI()

元素所属的Namespace对象的URI

getName()

元素的local name

getQualifiedName()

元素的qualified name

getText()

元素所含有的text内容,如果内容为空则返回一个空字符串而不是null

getTextTrim()

元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null

attributeIterator()

元素属性的iterator,其中每个元素都是Attribute对象

attributeValue()

元素的某个指定属性所含的值

elementIterator()

元素的子元素的iterator,其中每个元素都是Element对象

element()

元素的某个指定(qualified name或者local name)的子元素

elementText()

元素的某个指定(qualified name或者local name)的子元素中的text信息

getParent

元素的父元素

getPath()

元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔

isTextOnly()

是否该元素只含有text或是空元素

isRootElement()

是否该元素是XML树的根节点

4、举例

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="TB10001" country="chinese">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
    </user>

    <user id="TB10002" country="chinese">
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
    </user>
</users>
public class Dom4jParseUserXmlTest {
    public static void main(String[] args) {
        //1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //2.使用解析器对象读取XML文档生成Document对象
        try {
            Document read = saxReader.read(
                    Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
            //3.根据Document对象获取XML的元素(标签)信息
            Element rootElement = read.getRootElement();
            System.out.println("1.user.xml文件根节点的名字" + rootElement.getName());

            System.out.println("2.获取users的子标签列表");
            List<Element> usersSubElements = rootElement.elements();
            for (Element userElement : usersSubElements) {
                System.out.println("users标签的子标签的名字是:"+userElement.getName());
                System.out.println("users标签的子标签的id属性值:"+userElement.attributeValue("id"));
                System.out.println("users标签的子标签的country属性值:"+userElement.attributeValue("country"));
                System.out.println("3.获取user的子标签列表");
                List<Element> UserSubElements = userElement.elements();
                for (Element userSubElement : UserSubElements) {
                    System.out.println("user标签的子标签:"+userSubElement.getName());
                    System.out.println("user标签的子标签的文本是:"+userSubElement.getText());
                }
            }
            //获取users标签的第一个user标签
            Element firstUserElement = rootElement.element("user");
            //第一个user标签的子标签password的文本
            String password = firstUserElement.elementText("password");
            System.out.println("第一个user标签的子标签password的文本:"+password);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

5、使用xpath优化(依赖已经导入)

学习地址:XPath 教程 (w3school.com.cn)

XPath的语法
绝对路径方式,以/开头的路径表示绝对路径,绝对路径是从根元素开始写。例如/元素/子元素/子子元素…
相对路径方式:相对于当前节点的元素继续查找的节点,不以/开头,/表示上一个元素,/表示当前元素

全文搜索路径方式:例如//子元素,//子元素//子子元素,子元素//子子元素
//表示无论中间有多少层,直接获取所有子元素所有满足条件的元素
/表示只找一层

谓语(条件筛选)方式例如/元素[@attr1=value’]

package dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

public class Dom4jXPathParseUserXmlTest {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document =
                    saxReader.read(Dom4jXPathParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
            //第一个用户的密码
            System.out.println("1.使用绝对路径方式查找元素");
            Node element = document.selectSingleNode("/users/user/password");
            String password = element.getText();
            System.out.println("第一个用户的密码:"+password);

            System.out.println("2.使用相对路劲查找元素");
            Node salaryElement = element.selectSingleNode("../salary");
            String salary = salaryElement.getText();
            System.out.println("第一个用户的薪水区间:" + salary);

            System.out.println("3.使用全文搜索的方式");
            System.out.println("获取所有ID元素的文本");
            List<Node> idNodeList = document.selectNodes("//id");
            for (Node node : idNodeList) {
                Element idElement = (Element) node;
                System.out.println(idElement.getText());
            }
            //4.谓语(条件筛选)方式例如/元素[@attr1=value']
            Element TB10001idElement = (Element) document.selectSingleNode("//user[@id='TB10001']");
            List<Element> elementList = TB10001idElement.elements();
            for (Element userSubElement : elementList) {
                userSubElement.setName("idss");
                System.out.println("user标签的子标签的名字是:"+userSubElement.getName());
                System.out.println("user子标签的文本:"+userSubElement.getText());
            }


        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值