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