Java DOM4J 解析器 - 修改 XML 文档



Java DOM4J API 提供了修改 XML 文档的方法。我们可能会遇到需要更新大型 XML 文档中某些细节的情况。例如,一个电子商务网站有很多产品,其价格可能每天或每月都会变化。在这种情况下,修改现有文件比重新创建 XML 文档更简单。本章我们将通过一些例子学习如何使用 DOM4J API 修改现有的 XML 文档。

使用 Java DOM4J 解析器修改 XML

以下是使用 Java DOM4J 解析器修改 XML 文档的步骤:

  • 步骤 1:创建 SAXReader 对象
  • 步骤 2:读取 XML 文件
  • 步骤 3:解析 XML
  • 步骤 4:提取根元素
  • 步骤 5:修改元素
  • 步骤 6:创建 FileOutputStream
  • 步骤 7:将更新后的 XML 文档写入文件
  • 步骤 8:打印 XML 文档

关于前四个步骤,请参考本节的 解析 XML 文档 一章。

步骤 5:修改元素

在步骤 4 提取根元素后,我们可以使用 elements() 方法获取其任何子元素。我们可以通过编辑文本内容、更改属性值、添加新属性等方式修改现有元素。

关于最后三个步骤,请参考本节的 创建 XML 文档 一章。

修改文本内容

要修改元素的文本内容,可以使用 setText() 方法设置文本内容。它接受一个字符串作为参数,并用新文本内容更新旧文本内容。此方法在 Node 和 Element 接口中都可用。

示例

在下面的 studentData.xml 文件中,我们需要将学号为 493 的学生的成绩从 80 分更新为 64 分。

<?xml version="1.0" encoding="UTF-8"?>
<class>
   <student rollno="393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno="493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>80</marks>
   </student>
   
   <student rollno="593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

下面的 ModifyTextContent.java 程序使用 SAXReader 读取上面的 studentData.xml 文件。使用 elementIterator("student") 方法,我们获得了迭代器中的所有学生元素。我们迭代所有元素以使用 attributeValue() 方法查找学号为 493 的学生,并更新成绩元素的文本内容。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class ModifyTextContent {
   public static void main(String[] args) {
      try {
    	  
    	 //Creating SAXReader
         SAXReader reader = new SAXReader();
         
    	 //Reading the XML file
         File inputFile = new File("studentData.xml");
         
         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();
         
         //Modifying the elements
         Iterator<Element> students = RootElement.elementIterator("student");
         while(students.hasNext()) {
        	Element student = students.next();
        	if(student.attributeValue("rollno").equals("493")) {       	   
        	   Element marks = student.element("marks");
        	   marks.setText("64");    	   
        	}
         }
         //Creating a FileOutputStream
         FileOutputStream newFile = new FileOutputStream("studentData.xml");
         
         //Writing the updated XML document into file
         XMLWriter writer = new XMLWriter(newFile);
         writer.write( document );
         
         //Printing the XML document
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter consoleWriter = new XMLWriter( System.out, format );
         consoleWriter.write( document );
         
      } catch(Exception e) {
    	 e.printStackTrace();
      }
   }
}

输出

学号为 493 的学生的成绩已从 80 分更新为 64 分。

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

<class> 
  <student rollno="393"> 
    <firstname>dinkar</firstname>  
    <lastname>kad</lastname>  
    <nickname>dinkar</nickname>  
    <marks>85</marks> 
  </student>  
  <student rollno="493"> 
    <firstname>Vaneet</firstname>  
    <lastname>Gupta</lastname>  
    <nickname>vinni</nickname>  
    <marks>64</marks> 
  </student>  
  <student rollno="593"> 
    <firstname>jasvir</firstname>  
    <lastname>singn</lastname>  
    <nickname>jazz</nickname>  
    <marks>90</marks> 
  </student> 
</class>

添加新元素

addElement() 方法将新元素添加到现有 XML 文档中,添加到当前元素所有现有子元素的末尾。我们需要将元素的标签名称作为参数传递。类似地,addText() 方法向元素添加文本内容。addAttribute() 方法向当前元素添加新属性。我们需要将属性名称和属性值作为参数传递。

下面的 AddNewElements.java 程序读取我们在上一个示例中使用的 studentData.xml 文件,并使用上述方法添加新学生的信息。

import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class AddNewElements {
   public static void main(String[] args) {
      try {
    	  
    	 //Creating SAXReader
         SAXReader reader = new SAXReader();
         
    	 //Reading the XML file
         File inputFile = new File("studentData.xml");
         
         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();
         
         //Modifying the elements
         Element student = RootElement.addElement("student").addAttribute("rollno", "693");

         student.addElement("firstname").addText("John");
         student.addElement("lastname").addText("Daniel");
         student.addElement("nickname").addText("Johny");
         student.addElement("marks").addText("78");

         //Creating a FileOutputStream
         FileOutputStream newFile = new FileOutputStream("studentData.xml");
         
         //Writing the updated XML document into file
         XMLWriter writer = new XMLWriter(newFile);
         writer.write( document );
         
         //Printing the XML document
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter consoleWriter = new XMLWriter( System.out, format );
         consoleWriter.write( document );
         
      } catch(Exception e) {
    	 e.printStackTrace();
      }
   }
}

输出

添加新学生信息后的文件内容如下:

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

<class> 
  <student rollno="393"> 
    <firstname>dinkar</firstname>  
    <lastname>kad</lastname>  
    <nickname>dinkar</nickname>  
    <marks>85</marks> 
  </student>  
  <student rollno="493"> 
    <firstname>Vaneet</firstname>  
    <lastname>Gupta</lastname>  
    <nickname>vinni</nickname>  
    <marks>64</marks> 
  </student>  
  <student rollno="593"> 
    <firstname>jasvir</firstname>  
    <lastname>singn</lastname>  
    <nickname>jazz</nickname>  
    <marks>90</marks> 
  </student>  
  <student rollno="693">
    <firstname>John</firstname>
    <lastname>Daniel</lastname>
    <nickname>Johny</nickname>
    <marks>78</marks>
  </student>
</class>
广告