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> 

如有问题欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值