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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章