在Java中修改XML文件(DOM分析器)

时间:2020-02-23 14:37:21  来源:igfitidea点击:

我们可以使用DOM解析器修改Java中的XML文件。
我们可以使用DOM Parser在Java中的XML文档中添加元素,删除元素,编辑元素值,编辑属性。

修改Java中的XML文件

假设我们有下面的源XML文件。
我们将学习如何使用DOM解析器在Java程序中修改或者编辑此XML文件。

employee.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Employees>
	<Employee id="1">
		<name>hyman</name>
		<age>29</age>
		<role>Java Developer</role>
		<gender>Male</gender>
	</Employee>
	<Employee id="2">
		<name>Lisa</name>
		<age>35</age>
		<role>CSS Developer</role>
		<gender>Female</gender>
	</Employee>
</Employees>

我们将通过以下更改来编辑XML文件。

  • 根据性别更新所有员工的" id"属性值。
    对于男性,id将以" M"为前缀,否则以" F"为前缀。

  • 通过使用大写字母来更新"名称"元素的值。

  • 删除"性别"元素,因为它现在不使用。

  • 向xml中的所有employee节点添加一个新元素" salary"。

对XML进行以上修改后,我们会将其保存到其他文件中。

这是使用DOM分析器进行上述所有更新的Java程序。

ModifyXMLDOM.java

package com.theitroad.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ModifyXMLDOM {

  public static void main(String[] args) {
      String filePath = "employee.xml";
      File xmlFile = new File(filePath);
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder;
      try {
          dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(xmlFile);
          doc.getDocumentElement().normalize();
          
          //update attribute value
          updateAttributeValue(doc);
          
          //update Element value
          updateElementValue(doc);
          
          //delete element
          deleteElement(doc);
          
          //add new element
          addElement(doc);
          
          //write the updated document to file or console
          doc.getDocumentElement().normalize();
          TransformerFactory transformerFactory = TransformerFactory.newInstance();
          Transformer transformer = transformerFactory.newTransformer();
          DOMSource source = new DOMSource(doc);
          StreamResult result = new StreamResult(new File("employee_updated.xml"));
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
          transformer.transform(source, result);
          System.out.println("XML file updated successfully");
          
      } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
          e1.printStackTrace();
      }
  }

  private static void addElement(Document doc) {
      NodeList employees = doc.getElementsByTagName("Employee");
      Element emp = null;
      
      //loop for each employee
      for(int i=0; i<employees.getLength();i++){
          emp = (Element) employees.item(i);
          Element salaryElement = doc.createElement("salary");
          salaryElement.appendChild(doc.createTextNode("10000"));
          emp.appendChild(salaryElement);
      }
  }

  private static void deleteElement(Document doc) {
      NodeList employees = doc.getElementsByTagName("Employee");
      Element emp = null;
      //loop for each employee
      for(int i=0; i<employees.getLength();i++){
          emp = (Element) employees.item(i);
          Node genderNode = emp.getElementsByTagName("gender").item(0);
          emp.removeChild(genderNode);
      }
      
  }

  private static void updateElementValue(Document doc) {
      NodeList employees = doc.getElementsByTagName("Employee");
      Element emp = null;
      //loop for each employee
      for(int i=0; i<employees.getLength();i++){
          emp = (Element) employees.item(i);
          Node name = emp.getElementsByTagName("name").item(0).getFirstChild();
          name.setNodeValue(name.getNodeValue().toUpperCase());
      }
  }

  private static void updateAttributeValue(Document doc) {
      NodeList employees = doc.getElementsByTagName("Employee");
      Element emp = null;
      //loop for each employee
      for(int i=0; i<employees.getLength();i++){
          emp = (Element) employees.item(i);
          String gender = emp.getElementsByTagName("gender").item(0).getFirstChild().getNodeValue();
          if(gender.equalsIgnoreCase("male")){
              //prefix id attribute with M
              emp.setAttribute("id", "M"+emp.getAttribute("id"));
          }else{
              //prefix id attribute with F
              emp.setAttribute("id", "F"+emp.getAttribute("id"));
          }
      }
  }

}

下面给出了来自上述程序的XML文件的输出修改版本。

employee_updated.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Employees>
	<Employee id="M1">
		<name>hyman</name>
		<age>29</age>
		<role>Java Developer</role>
		
	<salary>10000</salary>
</Employee>
	<Employee id="F2">
		<name>LISA</name>
		<age>35</age>
		<role>CSS Developer</role>
		
	<salary>10000</salary>
</Employee>
</Employees>