Java JDOM 解析器 - 修改 XML 文件



Java JDOM 解析器是 Java 中的一個 API,它包含用於修改 XML 文件的類和介面。此 API 以樹形結構的形式表示 XML 文件,並且可以輕鬆檢索每個元素。因此,修改變得非常容易。我們可以使用 setText() 方法修改內容,並使用 addContent() 方法新增新元素。在本章中,我們將透過兩個示例瞭解如何修改現有的 XML 文件。

使用 JDOM 解析器修改 XML

我們可以透過以下步驟在 Java JDOM 解析器中修改 XML 文件:

  • 步驟 1:建立 SAXBuilder 物件
  • 步驟 2:讀取 XML
  • 步驟 3:解析 XML 文件
  • 步驟 4:更新 XML 文件的內容
  • 步驟 5:將內容寫入 XML 檔案
  • 步驟 6:輸出到控制檯以進行測試

有關前三個步驟,請參閱本節的第二章

步驟 4:更新 XML 文件的內容

在完成前三個步驟後,我們已成功讀取了需要更新的 XML 文件。現在,我們以 JDOM 文件的形式擁有了 XML 檔案。要從文件中獲取任何資訊,首先,我們始終應該獲取根元素。檢索根元素後,我們可以獲取根元素內所有元素的資訊。

有關步驟 5 和 6,請參閱本節的本章

更新文字內容

要更新任何元素的文字內容,我們可以使用 Element 類的 setText() 方法。此方法以字串形式將文字內容作為引數。如果文字內容已存在,則會用新文字內容更新舊文字內容。

示例

這裡,我們有college.xml檔案,其中包含三個 department 元素。我們將把 id 為 102 的部門的員工人數從 23 修改為 14。

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

以下ModifyTextContent.java程式使用 SAXBuilder 物件讀取上述 college.xml 檔案。在獲取 department 元素列表後,我們使用 getAttributeValue() 方法查詢 id 為 102 的部門。之後,我們使用 setText() 方法更新文字內容。

import java.io.File;
import java.util.List;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.jdom2.transform.JDOMSource;

public class ModifyTextContent {
   public static void main(String args[]) {
      try {
	    	  
         //Creating a SAXBuilder Object
	     SAXBuilder saxBuilder = new SAXBuilder();
	          
	     //Reading the XML
	     File inputFile = new File("college.xml");
	          
	     //Parsing the XML Document
	     Document doc = saxBuilder.build(inputFile);
	         
	     //Retrieving the Root Element
	     Element RootElement = doc.getRootElement();
	     List<Element> deptList = RootElement.getChildren("department");
	         
	     //Finding "department" with id=102 in the list
	     for(int index=0; index<deptList.size();index++) {
	        Element department = deptList.get(index);
	        if(department.getAttributeValue("id").equals("102")) {
	           Element staffCount = department.getChild("staffCount");
	           //Updating the staff count
	           staffCount.setText("14");
	           break;
	        }
	     }
	     //writing the modified content into XML file
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         JDOMSource source = new JDOMSource(doc);
         StreamResult result = new StreamResult(new File("college.xml"));
         transformer.transform(source, result);

         //Output to console for testing
         XMLOutputter xmlOutput = new XMLOutputter();
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(doc, System.out);
      } 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>

新增新元素

Element 類的 addContent() 方法接受子元素並將其附加到當前元素下一級。它始終將新元素新增到末尾。如果我們傳遞兩個引數,索引和子元素,則子元素將插入到指定的索引處。

示例

現在,我們將在下面的AddNewElements.java程式中向 college 元素新增另一個名為“Civil”的部門。我們已建立了 department 的子元素並將其新增到 department 元素中。之後,我們將 department 新增到根元素中。

import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.jdom2.transform.JDOMSource;

public class AddNewElements {
   public static void main(String args[]) {
      try {
	    	  
         //Creating a SAXBuilder Object
	     SAXBuilder saxBuilder = new SAXBuilder();
	          
	     //Reading the XML
	     File inputFile = new File("college.xml");
	          
	     //Parsing the XML Document
	     Document doc = saxBuilder.build(inputFile);
	         
	     //Retrieving the Root Element
	     Element RootElement = doc.getRootElement();
	         
	     //Creating new "department" Element
	     Element department=new Element("department");
	     department.setAttribute("id","104");
	     
	     //Creating "name" Element for department
	     Element name=new Element("name");
	     name.setText("Civil");
	     
	     //Creating "staffCount" Element for department
	     Element staffCount=new Element("staffCount");
	     staffCount.setText("18");
	     
	     //Appending Elements
	     department.addContent(name);
	     department.addContent(staffCount);
	     RootElement.addContent(department);
	     
	     //writing the modified content into XML file
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         JDOMSource source = new JDOMSource(doc);
         StreamResult result = new StreamResult(new File("college.xml"));
         transformer.transform(source, result);

         //Output to console for testing
         XMLOutputter xmlOutput = new XMLOutputter();
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(doc, System.out);
      } catch(Exception e) {
             e.printStackTrace();
	  }
   }
}

輸出

新增“Civil”部門後的更新檔案如下所示

<?xml version="1.0" encoding="UTF-8"?>
<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>
  <department id="104">
    <name>Civil</name>
    <staffCount>18</staffCount>
  </department>
</college>
廣告