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