Dom4j解析

Java 使用 Dom4j 解析XML

今天给大家分享一个我刚学到的、、、如何使用Dom4j解析XML文件

环境准备

(1)下载dom4j-2.1.1.jar
(2)JDK 1.8以上
(3)我用的IDEA(大家随意)

Dom4j解析XML的含义

解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作

Dom4j解析XML的过程

首先,我们写一个XML文件,然后对他进行一系列操作
info.xml 代码如下

<?xml version="1.0" encoding="UTF-8"?>
<phoneInfo>
    <brand name="小米">
        <type name="小米8"/>
        <type name="小米9"/>
        <type name="小米MIX"/>
    </brand>
    <brand name="iphone">
        <type name="IPhoneX"/>
        <type name="IPhoneXs"/>
        <type name="IPhone7"/>
    </brand>
    <brand name="华为">
        <type name="P20"/>
        <type name="P30"/>
        <type name="P30 pro"/>
    </brand>
</phoneInfo>

有了xml文件后,我们就可以对他进行一系列操作了
我们先在控制台进行对xml文件的读取

我们先建一个测试类Test.class

package cn.kgc.dom4jtest;

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

import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            //读取xml文件,生成document对象
            Document document = saxReader.read("src/info.xml");
            Element rootElement = document.getRootElement();
            
            System.out.println("根节点的名字:"+rootElement.getName());
            //获取子节点列表
            Iterator it = rootElement.elementIterator();
            while (it.hasNext()){
                Element firstChild = (Element) it.next();
                System.out.println(firstChild.getName());
                //获取节点的属性值
                System.out.println(firstChild.attribute("name").getValue());
                //获取子节点的下一级节点
                Iterator iterator = firstChild.elementIterator();
                while (iterator.hasNext()){
                    Element element = (Element) iterator.next();
                    System.out.println("\t"+element.attributeValue("name"));
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:
在这里插入图片描述
然后我们再建一个AddTest.class
进行添加数据

package cn.kgc.dom4jtest;

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

import java.io.*;

public class AddTest1 {
    public static void main(String[] args){
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/info.xml");
            Element rootElement = document.getRootElement();
            //添加一个子节点
            Element brand = rootElement.addElement("brand");
            //给当前节点添加属性
            brand.addAttribute("name","魅族");
            Element type = brand.addElement("type");
            type.addAttribute("name","s16");
            OutputStream os = new FileOutputStream(new File("src/info.xml"));
            XMLWriter xmlWriter = new XMLWriter(os);
            xmlWriter.write(rootElement);
            xmlWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我们打开自己的xml文件,查看是否发生了变化在这里插入图片描述
有了这句话就对了,然后我们再建一个UpdateTest.class

package cn.kgc.dom4jtest;

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

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;

public class updataTest {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/info.xml");
            //获取根节点
            Element rootElement = document.getRootElement();
            Iterator it = rootElement.elementIterator();
            while(it.hasNext()){
                Element element = (Element) it.next();
                System.out.println(element.attributeValue("name"));
                if (element.attributeValue("name").equals("魅族")){
                    Iterator iterator = element.elementIterator();
                    while (iterator.hasNext()){
                        Element type = (Element) iterator.next();
                        if (type.attributeValue("name").equals("s16")){
                            type.addAttribute("name","16 pro");
                        }
                    }
                }
            }
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
            xmlWriter.write(document);
            xmlWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:
在这里插入图片描述
成功后我们就可以做接下来的删除了
我们再建个删除类DeleteTest

package cn.kgc.dom4jtest;

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

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;

/**
 * lxl
 * 删除测试
 */
public class DeleteTest {
    public static void main(String[] args) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read("src/info.xml");
            Element rootElement = document.getRootElement();
            Iterator iterator = rootElement.elementIterator();
            while(iterator.hasNext()){
                Element brand = (Element) iterator.next();
                if (brand.attributeValue("name").equals("魅族")){
                    //通过父节点删除子节点
                    brand.getParent().remove(brand);
                }
            }
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml")));
            xmlWriter.write(document);
            xmlWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我们运行成功后可以看一下我们的XML,会发现里面就剩一个根目录了,不要慌,删了就对了

最后,我给大家封装了一个读取XML文件的方法,方便大家使用


public void List(Element root){
        System.out.println("根节点的姓名:"+root.getName());
        //获取子节点列表
        Iterator it = root.elementIterator();
        while (it.hasNext()){
            Element fristChild = (Element) it.next();
            System.out.println(fristChild.getName());
            System.out.println(" "+fristChild.attribute("name").getValue());
            Iterator iterator = fristChild.elementIterator();
            while (iterator.hasNext()){
                Element element = (Element) iterator.next();
                System.out.println("\t"+element.attributeValue("name"));
            }
        }
    }

最后,欢迎各位大佬多多指点
有一起学习的可以加我微信:lxl1052681394

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值