
- Java XML 教程
- Java XML 首頁
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XML 有用資源
- Java XML - 常見問題解答
- Java XML - 快速指南
- Java XML - 有用資源
- Java XML - 討論
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>