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