dom4j解析xml執行增刪查改

在整理dow4j解析xml進行增刪查改時,百度谷歌了一天沒有發現比較完整的程序,自己整理加上自己的一些想法整理了一份程序

項目結構:

xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore> 
  <book name="書本1">
    <name>大話數據結構</name>
    <year>2019</year>  
    <price>77</price>  
    <language>中文</language> 
  </book>  
  <book name="書本2">
    <name>kvm</name>  
    <year>2019</year>  
    <price>66</price>  
    <language>英文</language> 
  </book>  
  <book name="書本3">
    <name>數據庫</name>  
    <year>2019年</year>  
    <price>16</price>  
    <language>中文</language> 
  </book>  
  <book name="書本4">
    <name>空調</name>  
    <year>2019年</year>  
    <price>16</price>  
    <language>製冷</language> 
  </book>  
  <book name="書本5">
    <name>風扇</name>  
    <year>1999年</year>  
    <price>88</price>  
    <language>漢化版</language> 
  </book>  
  <book name="書本6">
    <name>Java大全</name>  
    <year>1986年</year>  
    <price>88</price>  
    <language>最流行編程之一</language> 
  </book> 
</bookstore>

對應的代碼:

package dom4j;

import org.dom4j.Attribute;
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.*;
import java.util.Iterator;
import java.util.List;

//dom4j解析xml並且執行(增、刪、改、查)操作
public class Dom4JCRUD {

    private Document document;

    public static void main(String[] args){

        Dom4JCRUD domXml = new Dom4JCRUD();
        domXml.getDom();
        domXml.addPhoneInfo();/**增加節點,不會添加id屬性*/
        domXml.deletePhoneInfo();/**刪除節點*/
        domXml.updatePhoneInfo();/**修改節點*/
        domXml.showPhoneInfo();/**遍歷節點*/
    }

    //獲取DOM樹
    public void getDom(){
        SAXReader reader = new SAXReader();
        try {
            document = reader.read(new File("src/dom4j/books.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    //增加節點信息
    public void addPhoneInfo(){
        //獲取根節點元素
        Element element = document.getRootElement();
        //添加節點
        Element book = element.addElement("book");
        //爲根節點添加屬性並且賦值
        book.addAttribute("name","書本7");
        Element name=book.addElement("name");
        Element year=book.addElement("year");
        Element price=book.addElement("price");
        Element language=book.addElement("language");
        name.setText("Python");
        year.setText("1968年");
        price.setText("16");
        language.setText("最流行編程之一");
        saveXml("src/dom4j/books.xml");
    }

    //刪除節點信息
    public void deletePhoneInfo(){
        //獲取根節點
        Element element = document.getRootElement();
        Iterator books = element.elementIterator();

        //遍歷獲取每個節點信息
        while(books.hasNext()){
            Element book = (Element)books.next();
            //刪除name爲某一值的節點
            String deleteBookName = "書本6";
            System.out.println("刪除的節點名爲:"+book.attributeValue("name"));
            if(book.attributeValue("name").equals(deleteBookName)){
                book.getParent().remove(book);
            }
        }
        //保存信息
        saveXml("src/dom4j/books.xml");
    }

    //修改節點信息
    public void updatePhoneInfo(){
        //獲取信息
        Element element = document.getRootElement();
        Iterator books = element.elementIterator();

        //遍歷獲取每個節點信息
        while(books.hasNext()){
            Element book = (Element)books.next();
            //修改name爲某一值的節點
            String updateBookName ="書本7";
            System.out.println("需要修改的節點名爲:"+book.attributeValue("name"));
            if(book.attributeValue("name").equals(updateBookName)){
                //解析子節點的信息
                Iterator itt = book.elementIterator();
                while (itt.hasNext()) {
                    Element bookChild = (Element) itt.next();
                    //修改子節點名爲name的值
                    String name ="name";
                    if(bookChild.getName().equals(name)){
                        System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
                        bookChild.setText("Python大全");
                        System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
                    }
                    //修改子節點名爲year的值
                    String year ="year";
                    if(bookChild.getName().equals(year)){
                        System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
                        bookChild.setText("1996年");
                        System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
                    }
                    //修改子節點名爲price的值
                    String price ="price";
                    if(bookChild.getName().equals(price)){
                        System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
                        bookChild.setText("88");
                        System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
                    }
                    //修改子節點名爲language的值
                    String language ="language";
                    if(bookChild.getName().equals(language)){
                        System.out.println("節點名:" + bookChild.getName() + "--原節點值:" + bookChild.getStringValue());
                        bookChild.setText("被人工智能帶火的語言");
                        System.out.println("節點名:" + bookChild.getName() + "--修改後的節點值:" + bookChild.getStringValue());
                    }

                }
            }
        }
        /**重新排序一下xml,加上id*/
        Iterator addBookId = document.getRootElement().elementIterator();//這是把兩行代碼合成一行了
        int id = 0;
        while(addBookId.hasNext()){
            Element addId = (Element)addBookId.next();
            id++;
            addId.addAttribute("id",id+"");
        }

        saveXml("src/dom4j/books.xml");
    }

    //顯示節點信息
    public void showPhoneInfo() {
        // 通過document對象獲取根節點bookstore
        Element element = document.getRootElement();
        // 通過element對象的elementIterator方法獲取迭代器
        Iterator books = element.elementIterator();
        // 遍歷迭代器,獲取根節點中的信息(書籍)
        int i=1;
        while (books.hasNext()) {
            System.out.println("=====開始遍歷第"+ i +"個節點=====");
            Element book = (Element) books.next();

            // 獲取book的屬性名以及 屬性值
            List<Attribute> bookAttrs = book.attributes();
            for (Attribute attr : bookAttrs) {
                System.out.println("屬性名:" + attr.getName() + "--屬性值:" + attr.getValue());
            }
            //解析子節點的信息
            Iterator itt = book.elementIterator();
            while (itt.hasNext()) {
                Element bookChild = (Element) itt.next();
                System.out.println("節點名:" + bookChild.getName() + "--節點值:" + bookChild.getStringValue());
            }
            System.out.println("=====結束遍歷第"+ i +"個節點=====");
            i++;
        }
    }

    //保存信息到xml
    public void saveXml(String path){
        //格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        //指定字符編碼格式
        format.setEncoding("UTF-8");
        XMLWriter writer = null;
        //將文件按照指定格式輸出到指定路徑中
        try {
            writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path)),format);
            writer.write(document);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                //關閉服務
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

這個添加節點默認沒有id屬性,在修改代碼裏有重新排序xml加上id的代碼:

        /**重新排序一下xml,加上id*/
        Iterator addBookId = document.getRootElement().elementIterator();//這是把兩行代碼合成一行了
        int id = 0;
        while(addBookId.hasNext()){
            Element addId = (Element)addBookId.next();
            id++;
            addId.addAttribute("id",id+"");
        }

如果xml中節點是嵌套的也可以進行解析,例如:

  <book name="書本1">
      <name>
          <name1>大話數據結構</name1>
          <name2>大話數據庫</name2>
          <name3>設計模式</name3>
      </name>
    <year>2019</year>  
    <price>77</price>  
    <language>中文</language> 
  </book> 

如有問題歡迎指出。

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