使用Dom4j解析XML文件

一、XML解析 基础知识

1.1 XML解析种类

        XML解析方式有4种,分别是:DOM解析、SAX解析、JDOM解析、DOM4j解析。其中前两种属于基础方法,是官方提供的与平台无关的解析方式后两种属于扩展方法,是在基础方法上拓展出来的,只适用于java平台
        

1、DOM解析:JDK中都自带了,无需再导包。要求解析器将整个XML文件全部加载到内存种,生成一个Document对象。

  • 优点:元素和元素之间保留结构、关系,可以针对元素进行增删改查操作
  • 缺点:XML文件过大,可能会导致内存溢出

2、SAX解析:是一种速度更快,更加高效的解析方式,它是逐行扫描的,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件。

  • 优点:不会出现内存溢出的问题可以处理大文件
  • 缺点:智能读,不能写

1.2 解析器

解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员解析XML,有一些方便操作的类库。

  • dom4j:是比较简单的XML解析的类库
  • Jsoup:是功能强大的DOM方式解析的类库,尤其是对HTML的解析更加方便

二、使用dom4j解析XML

2.1 搭建环境

创建一个maven项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将项目的maven库改为本地仓库
在这里插入图片描述

加入依赖

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

resources根目录下创建user.xml文件,

在这里插入图片描述
并在user.xml文件中添加如下内容

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

    <user id="10002" country="Chinese" source="ios">
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
    </user>

</users>

2.2 解析XML文件

解析步骤介绍

1、创建解析器对象

 //创建解析器对象
    SAXReader saxReader = new SAXReader();

2、使用解析器对象读取XML文档生成Document对象

 Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));

3、根据Document对象获取XML的元素(标签信息)

            //3.1 获取XML文件的根节点
            Element rootElement = document.getRootElement();
            System.out.println("user.xml文件的根节点的名字为"+rootElement.getName());
            //3.2 获取XML文件的根节点下的子节点
            System.out.println("获取根标签users的子标签列表");
            List<Element> usersSubElementList = rootElement.elements();
            for (Element userElement : usersSubElementList) {
                //String attributeValue(String name);获取指定属性名称的属性值
                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("users标签的子标签的sources属性值"+userElement.attributeValue("source"));
                System.out.println("3、获取user的子标签列表");

创建名称为Dom4jParseUserXmlTest的类,并且添加如下内容,开始解析

package com.li.dom4j;

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

import java.util.List;

/**
 * @author potential
 */
public class Dom4jParseUserXmlTest {
    public static void main(String[] args)  {
        //1、创建解析器对象
        SAXReader saxReader = new SAXReader();
        //2、使用解析器对象读取XML文档生成Document对象
        try {
            Document document = saxReader.read(Dom4jParseUserXmlTest.class.getClassLoader().getResource("user.xml"));
            //3、根据Document对象获取XML的元素标签信息

            /**
             * 1、org.dom4j.Document常用方法
             *      Element getRootElement(); 获取XML文件的根节点
             * 2、org.dom4j.Element常用方法
             *      String getName();返回
             *      List<Element>elements();获取标签的子标签
             */
            //3.1 获取XML文件的根节点
            Element rootElement = document.getRootElement();
            System.out.println("user.xml文件的根节点的名字为"+rootElement.getName());
            //3.2 获取XML文件的根节点下的子节点
            System.out.println("获取根标签users的子标签列表");
            List<Element> usersSubElementList = rootElement.elements();
            for (Element userElement : usersSubElementList) {
                //String attributeValue(String name);获取指定属性名称的属性值
                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("users标签的子标签的sources属性值"+userElement.attributeValue("source"));
                System.out.println("3、获取user的子标签列表");
                List<Element> userSubElementList = userElement.elements();
                for (Element userSubElement : userSubElementList) {
                    System.out.println("user标签下的子标签名字是"+userSubElement.getName());
                    //String getText();获取标签的文本
                    System.out.println("user标签下的子标签的文本是"+userSubElement.getText());

                }
            }
            //获取users标签的第一个user标签
            Element firstUserElement = rootElement.element("user");
            //获取第一个user标签下的子标签password属性的文本
            //String elementText(String name);获取指定名称的子标签的文本
            String password = firstUserElement.elementText("password");
            System.out.println("第一个user标签的子标签password的文本"+password);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

运行结果展示
在这里插入图片描述

2.3 dom4j重要API说明

org.dom4j.Document常用方法

Element getRootElement()获取XML文件的根节点

org.dom4j.Element常用方法

String getName()返回元素名称
Listelements()获取标签的子标签
String attributeValue(String name)获取指定属性名称的属性值
String getText()获取标签的文本
String elementText(String name)获取指定名称的子标签的文本
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值