java对xml节点属性的增删改查实现方法(具体注释版)

import java.io.File;
import java.io.FileWriter;
import java.util.List;

import org.dom4j.Document;

import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jDemo {
    static File url = new File("src/Persons.xml");// Persons.xml文件绝对路径
     
    public static void main(String[] args) throws Exception {
        //dom4jGetElement();// dom4j原生方式解析xml
        //dom4jXPathGetElement();// dom4j Xpath方式解析xml
        dom4jUpdateElement();//修改数据
        //dom4jAddElement();//添加数据
        //dom4jDeleteElement();//删除数据
    }
 
    public static void dom4jGetElement() throws Exception {
        // 获取一个Document对象
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(url);
 
        // 通过文档对象doc获取文档中的根节点
        Element root = doc.getRootElement();
        // 获取节点person
        List<Element> personList = root.elements();// 获取多个标签(即根节点下的子节点),返回集合对象
 
        // 获取第1个节点
        Element person = personList.get(0);
        // 获取第1个节点下的name元素
        Element element = person.element("name");
        // 获取name中的文本
        System.out.println(element.getText());
        System.out.println(person.elementText("name"));
 
        // 注意:只能获取一次节点值    第二次获取的值还是第一次的!!
        /* Element person2 = personList.get(1); 
         Element element2 =person.element("name");
         System.out.println(element2.getText());*/
        
        
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
        XMLWriter writer = new XMLWriter(new FileWriter("./src/contact.xml"),format);
    }
 
    public static void dom4jXPathGetElement() throws Exception {
        // 获取一个Document对象
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(url);
        
        // 获取id为1的节点下的name元素
        Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
        System.out.println(name.getText());
    }
 
    public static void dom4jUpdateElement() throws Exception {
        // 获取一个Document对象
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(url);
        
        // 获取id为1的节点下的name元素
        Node name = doc.selectSingleNode("/persons/person[@id = '1']/name[1]");
        name.setText("这里是修改的id为1的节点下的name元素值");
 
        // 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
       
        XMLWriter writer = new XMLWriter(new FileWriter(url),format);//将内存数据关联给一个字符输出流
        writer.write(doc);
        writer.close();
        
        
        
    }
 
    public static void dom4jAddElement() throws Exception {
        // 获取一个Document对象
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(url);
        
        //获取根节点
        Element root = doc.getRootElement();
        //添加一个标签 即一个节点
        Element person = root.addElement("person");
 
        //添加值到节点中
        person.addElement("name").setText("小星");
        person.addElement("age").setText("16");
        person.addElement("sex").setText("女");
 
        // 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
        //XMLWriter writer = new XMLWriter(new FileWriter(url));
        
        // 按照指定格式将dom打印到xml文件中
        //方式一:
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileWriter(url), format);//构造一个具有良好输出格式的XML输出对象
        writer.write(doc);
        writer.close();
        
        //方式二:
//        OutputFormat format = OutputFormat.createCompactFormat();
//        writer = new XMLWriter(new FileWriter(url), format);
//        writer.write( doc );
//        writer.close();
    }
    
    public static void dom4jDeleteElement() throws Exception {
        // 获取一个Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(url);        
        
        // 通过文档对象doc获取文档中的根节点
        Element root = doc.getRootElement();
        //获取第2个节点
        Node person = root.selectSingleNode("/persons/person[2]");
        //移出节点
        root.remove(person);
        
        // 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
        XMLWriter writer = new XMLWriter(new FileWriter(url));
        
        // 按照指定格式将dom打印到xml文件中
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter(new FileWriter(url), format );
        writer.write( doc );
        writer.close();
        
        
        
        
    }


}

xml文件 (文件名Person.xml)

<?xml version="1.0" encoding="GBK"?>

<persons> 
  <person id="0"> 
    <name>翠花</name>  
    <age>18</age>  
    <sex>女</sex> 
  </person>  
  <person id="1"> 
    <name>这里是修改的id为1的节点下的name元素值</name>  
    <age>20</age>  
    <sex>男</sex> 
  </person> 
</persons>

需要的jar包及基本结构

posted @ 2021-06-06 00:50  这里那里  阅读(437)  评论(0)    收藏  举报
Live2D