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>
廣告