
- 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 DOM 解析器 - 修改 XML 文件
Java DOM 解析器 API 提供了修改已存在 XML 文件的方法。我們可以使用 Java DOM 解析器的方法新增或刪除元素和屬性,修改元素和屬性值的文字內容。
setTextContent() 方法替換元素的原始文字,removeAttribute() 刪除現有的屬性,setAttribute() 方法為元素設定新的屬性。
使用 Java DOM 解析器修改 XML
我們可以透過以下步驟使用 Java 中的 DOM 解析器修改 XML 文件。
- 步驟 1:建立 DocumentBuilder 物件
- 步驟 2:讀取 XML
- 步驟 3:解析 XML 文件
- 步驟 4:更新 XML 文件的內容
- 步驟 5:將內容寫入 XML 檔案
- 步驟 6:輸出到控制檯進行測試
請參考本節的此頁面瞭解前三個步驟。
步驟 4:更新 XML 文件的內容
我們可以更新文字內容、屬性值、新增新的元素和新的屬性到我們現有的 XML 文件中。
Element element = xmldoc.getDocumentElement(); element.setTextContent("14"); element.removeAttribute("attr_name"); element.setAttribute("attr_name","attr_value");
setTextContent("text_content") 方法用於設定元素的文字內容。此方法與 Element 物件一起使用,並以字串作為引數。
removeAttribute("attr_name") 方法從 Element 物件中刪除屬性。如果我們要從中刪除屬性的 Element 是隻讀的,則會丟擲NO_MODIFICATION_ALLOWED_ERR 錯誤。
setAttribute("attr_name","attr_value") 方法以屬性名稱和屬性值作為引數,並將它們設定為 Element 物件。
更新文字內容
讓我們考慮 college.xml 檔案,其中包含三個部門的詳細資訊。現在,我們將嘗試將電氣和電子工程系的教職工人數從 23 更新為 14。setTextContent("text") 方法用於更新元素的文字內容。
college.xml
以下是更新前的 college.xml 檔案。現在讓我們嘗試在我們的 Java 程式中更新它。
<?xml version="1.0" encoding="UTF-8" standalone="no"?><college> <department id="101"> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department id="102"> <name>Electrical and Electronics</name> <staffCount>23</staffCount> </department> <department id="103"> <name>Mechanical</name> <staffCount>15</staffCount> </department> </college>
ModifyXMLDemo.java
在下面的 Java 程式中,我們將所有標記名為“department”的節點檢索到 NodeList 中。然後,我們迭代所有節點以查詢“電氣和電子工程”系,並將 staffCount 屬性更改為 14。
import java.io.File; import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class ModifyXMLDemo { public static void main(String argv[]) { try { //Creating a DocumentBuilder Object DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); //Reading the XML file File inputFile = new File("src/modifydom.xml"); //Parsing the XML Document Document doc = docBuilder.parse(inputFile); //Updating the staffCount for "Electrical and Electronics" department NodeList deptList=doc.getElementsByTagName("department"); for(int i=0;i<deptList.getLength();i++) { Element element= (Element) (deptList.item(i)); String s=element.getElementsByTagName("name").item(0).getTextContent(); if(s.equals("Electrical and Electronics")) { Element staffCount = (Element) element.getElementsByTagName("staffCount").item(0); staffCount.setTextContent("14"); } } //Writing the updated content into the file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); FileOutputStream output = new FileOutputStream("college.xml"); StreamResult result = new StreamResult(output); transformer.transform(source, result); //writing the content on console StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace();} } }
輸出
以下是更新 staffCount 後更新的 XML 文件。
<?xml version="1.0" encoding="UTF-8" standalone="no"?><college> <department id="101"> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department id="102"> <name>Electrical and Electronics</name> <staffCount>14</staffCount> </department> <department id="103"> <name>Mechanical</name> <staffCount>15</staffCount> </department> </college>
新增新元素
現在,讓我們更進一步,嘗試將另一個名為“土木工程”的系新增到我們上面的“college.xml”檔案中。要新增新元素,我們可以使用createElement("Element_name") 方法建立,並使用appendChild(Element) 將元素附加到現有文件的根元素。
ModifyXMLAddElementsDemo.java
在下面的程式中,我們首先使用 getDocumentElement() 方法獲取根元素。然後,我們建立“土木工程”系元素並將其新增到根元素。
import java.io.File; import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class ModifyXMLAddElementsDemo { public static void main(String argv[]) { try { //Creating a DocumentBuilder Object DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); //Reading the XML file File inputFile = new File("college.xml"); //Parsing the XML Document Document doc = docBuilder.parse(inputFile); //Adding new department element Element rootElement = doc.getDocumentElement(); Element department = doc.createElement("department"); department.setAttribute("id", "104"); Element name = doc.createElement("name"); Element staffCount = doc.createElement("staffCount"); department.appendChild(name); department.appendChild(staffCount); name.appendChild(doc.createTextNode("Civil")); staffCount.appendChild(doc.createTextNode("10")); rootElement.appendChild(department); //Creating transformer object TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); //Writing updated content into the file DOMSource source = new DOMSource(doc); FileOutputStream output = new FileOutputStream("college.xml"); StreamResult result = new StreamResult(output); transformer.transform(source, result); //writing the content on console StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace();} } }
輸出
新增“土木工程”系後的更新檔案如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?><college> <department id="101"> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department id="102"> <name>Electrical and Electronics</name> <staffCount>14</staffCount> </department> <department id="103"> <name>Mechanical</name> <staffCount>15</staffCount> </department> <department id="104"><name>Civil</name><staffCount>10</staffCount></department></college>