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