java使用DOM4j解析XML文件

发布于:2022-11-02 ⋅ 阅读:(381) ⋅ 点赞:(0)

1、简介

dom4j是java中的XML API,性能优异、功能强大、开放源代码。

也是所有解析XML文件方法中最常用的!

2、代码实操

准备需要j的ar包添加到lib目录下,dom4j-2.1.1.jar(网上随便找一个)

新建项目,在项目下创建info.xml

<?xml version="1.0" encoding="UTF-8"?>
<phone>
  <brand name="华为">
    <type name="mate30"/>
  </brand>
  <brand name="苹果"> 
    <type name="iphone12"/> 
  </brand>  
  <brand name="小米"> 
    <type name="红米"/>  
    <type name="小米8"/> 
  </brand>
</phone>

 创建类Test,再使用DOM4j实现对XML文件增删改查

1、获取Document对象

Document document=null;
private void getDocument() {
        //创建解析器
        SAXReader saxReader = new SAXReader();
        //解析指定的XML文件
        try {
            document = saxReader.read(new File("info.xml"));
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

2、展示所有的手机信息(这里也可以按照上篇DOM方式解析一样使用递归)

   private void showInfo() {
        //获取根节点
        Element root = document.getRootElement();

        //Iterator<Element> iterator = root.elementIterator();
        //while (iterator.hasNext()){
        //    Element next = iterator.next();
        //}

        /*这里是将遍历简写到for循环中,上面的while循环是我们通用的迭代器遍历 */
        for(Iterator<Element> brandIte=root.elementIterator();brandIte.hasNext();){
            //获取根节点下的所有子节点
            Element brand = brandIte.next();
            //输出元素节点名称和指定属性值
            System.out.println(brand.getName()+"\t"+brand.attributeValue("name"));
            //同样的方法,获取子节点
            for(Iterator<Element> typeIte = brand.elementIterator();typeIte.hasNext();){
                //接收每个子节点
                Element type = typeIte.next();
                //输出元素节点名称和指定属性值
                System.out.println(type.getName()+"\t"+type.attributeValue("name"));
            }
        }
    }

3、 添加手机信息

private void addInfo() {
        //获取根节点
        Element root = document.getRootElement();
        //根节点中插入子节点
        Element brand = root.addElement("brand");
        //为子节点赋予属性值
        brand.addAttribute("name","魅族");
        //为brand节点插入子节点1
        Element type1 = brand.addElement("type");
        //为子节点赋予属性值
        type1.addAttribute("name","哎呦");
        //为brand节点插入子节点2
        Element type2 = brand.addElement("type");
        //为子节点赋予属性值
        type2.addAttribute("name","卧槽");
        //保存
        save();
    }

DOM4j跟DOM一样都要通过某种方式保存实现真正的数据交互

DOM4j是通过输出流的方式进行保存

private void save() {
        //设置格式
        OutputFormat format =OutputFormat.createPrettyPrint();
        try {
            //指定输出文件
            XMLWriter writer = new XMLWriter(new FileWriter("info.xml"),format);
            //输出当前document对象
            writer.write(document);
            //关流
            writer.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

4、为每个手机品牌添加id编号

private void updateInfo() {
        //获取根节点
        Element root = document.getRootElement();
        //声明起始值用于输出编号
        int i=0;
        //遍历出子节点
        for(Iterator<Element> brandIte = root.elementIterator();brandIte.hasNext();){
            //接收每个子节点
            Element brand = brandIte.next();
            //为该子节点增加属性
            brand.addAttribute("id",i+"");
            i++;
        }
        //保存
        save();
    }

5、删除魅族手机

private void deleteInfo() {
        //获取根节点
        Element root = document.getRootElement();
        //遍历出子节点
        for(Iterator<Element> brandIte = root.elementIterator();brandIte.hasNext();){
            //接收子节点
            Element brand = brandIte.next();
            //判断该节点属性name是否为魅族
            if(brand.attributeValue("name").equals("魅族")){
                //通过父节点删除该节点
                brand.getParent().remove(brand);
            }
        }
        //保存
        save();
    }

3、我的完整代码展示

package XML.DOM4j;

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

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.getDocument();
        test.showInfo();
        test.addInfo();
        test.updateInfo();
        test.deleteInfo();
    }

    /**
     * 删除手机信息
     */
    private void deleteInfo() {
        Element root = document.getRootElement();
        for(Iterator<Element> brandIte = root.elementIterator();brandIte.hasNext();){
            Element brand = brandIte.next();
            if(brand.attributeValue("name").equals("魅族")){
                brand.getParent().remove(brand);
            }
        }
        save();
    }

    /**
     * 修改手机信息
     */
    private void updateInfo() {
        Element root = document.getRootElement();
        int i=0;
        for(Iterator<Element> brandIte = root.elementIterator();brandIte.hasNext();){
            Element brand = brandIte.next();
            brand.addAttribute("id",i+"");
            i++;
        }
        save();
    }

    /**
     * 添加手机信息
     */
    private void addInfo() {
        Element root = document.getRootElement();
        Element brand = root.addElement("brand");
        brand.addAttribute("name","魅族");
        Element type1 = brand.addElement("type");
        type1.addAttribute("name","哎呦");
        Element type2 = brand.addElement("type");
        type2.addAttribute("name","卧槽");
        save();
    }

    /**
     * 保存
     */
    private void save() {
        //设置格式
        OutputFormat format =OutputFormat.createPrettyPrint();
        try {
            XMLWriter writer = new XMLWriter(new FileWriter("info.xml"),format);
            writer.write(document);
            writer.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    Document document=null;

    /**
     * 显示手机信息
     */
    private void showInfo() {
        Element root = document.getRootElement();
        for(Iterator<Element> brandIte=root.elementIterator();brandIte.hasNext();){
            Element brand = brandIte.next();
            System.out.println(brand.getName()+"\t"+brand.attributeValue("name"));
            for(Iterator<Element> typeIte = brand.elementIterator();typeIte.hasNext();){
                Element type = typeIte.next();
                System.out.println(type.getName()+"\t"+type.attributeValue("name"));
            }
        }
    }
    private void getDocument() {
        SAXReader saxReader = new SAXReader();
        try {
            document = saxReader.read(new File("info.xml"));
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

}

谢谢观看!咕噜咕噜 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到