Java编程中更新XML文档的常用方法

当需要更新XML文档时,Java编程中有多种常用的方法。本文将介绍Java编程中经常使用的两种方法。

当需要更新XML文档时,Java编程中有多种常用的方法。本文将介绍Java编程中经常使用的两种方法。

方法一:使用DOM编程

DOM(文档对象模型)是一种Java内置的XML解析器。通常,使用DOM解析XML文档时,会将整个XML文件加载到内存中,构建一个XML的DOM树,程序员可以通过修改DOM树的方式来实现对XML文件的更新操作。

示例一:添加一个节点

考虑以下XML文档:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
   </book>
</catalog>

我们希望添加一个新的元素“price”到每一个图书(book)节点下。可以按照以下步骤进行:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class AddElement {
   public static void main(String[] args){

      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory docFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder =
         docFactory.newDocumentBuilder();
         Document doc = docBuilder.parse(inputFile);

         // 找到所有图书节点(book)
         NodeList bookList = doc.getElementsByTagName("book");

         // 在每个图书节点下添加price节点
         for (int i = 0; i < bookList.getLength(); i++) {
            Element bookElement = (Element) bookList.item(i);
            Element priceElement = doc.createElement("price");
            priceElement.appendChild(
            doc.createTextNode("29.99"));
            bookElement.appendChild(priceElement);
         }

         // 写回到XML文件中
         TransformerFactory transformerFactory =
         TransformerFactory.newInstance();
         Transformer transformer =
         transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         StreamResult result =
         new StreamResult(new File("output.xml"));
         transformer.transform(source, result);

      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

在上面的示例代码中,我们首先找到了所有图书(book)节点,并使用createElement()方法创建了一个新的price节点。在创建完成后,我们使用appendChild()方法将其添加到图书节点下。最后,我们使用Transformer API将DOM树重新写回到XML文件中。

示例二:替换一个节点

接下来看一个更为复杂的示例,我们将使用DOM API将XML文件中的一个节点替换成另一个节点。考虑以下XML文档:

<?xml version="1.0"?>
<class>
   <student id="001">
      <name>George</name>
      <gender>male</gender>
      <age>24</age>
      <email>george@example.com</email>
   </student>
   <student id="002">
      <name>Lucy</name>
      <gender>female</gender>
      <age>23</age>
      <email>lucy@example.com</email>
   </student>
</class>

我们希望将id为“001”的学生节点替换为如下节点:

<student id="001">
      <name>John</name>
      <gender>male</gender>
      <age>25</age>
      <email>john@example.com</email>
   </student>

此时可以使用如下代码实现:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class ReplaceElement {
   public static void main(String[] args){
      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory docFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder =
         docFactory.newDocumentBuilder();
         Document doc = docBuilder.parse(inputFile);

         // 找到id为001的学生节点
         NodeList studentList = doc.getElementsByTagName("student");
         for (int i = 0; i < studentList.getLength(); i++) {
            Element studentElement = (Element) studentList.item(i);
            String id = studentElement.getAttribute("id");
            if (id.equals("001")) {

               // 创建新的学生节点
               Element newStudent = doc.createElement("student");
               newStudent.setAttribute("id", "001");
               Element name = doc.createElement("name");
               name.appendChild(
               doc.createTextNode("John"));
               newStudent.appendChild(name);
               Element gender = doc.createElement("gender");
               gender.appendChild(
               doc.createTextNode("male"));
               newStudent.appendChild(gender);
               Element age = doc.createElement("age");
               age.appendChild(
               doc.createTextNode("25"));
               newStudent.appendChild(age);
               Element email = doc.createElement("email");
               email.appendChild(
               doc.createTextNode("john@example.com"));
               newStudent.appendChild(email);

               // 用新的节点替代旧的节点
               Node parent = studentElement.getParentNode();
               parent.replaceChild(newStudent, studentElement);
            }
         }

         // 写回到XML文件中
         TransformerFactory transformerFactory =
         TransformerFactory.newInstance();
         Transformer transformer =
         transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         StreamResult result =
         new StreamResult(new File("output.xml"));
         transformer.transform(source, result);

      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

在上面的示例代码中,我们首先定位了id为“001”的学生节点,并使用createElement()方法创建了一个新的节点。在创建完成后,我们使用replaceChild()方法将旧节点替换成新节点。最后,我们使用Transformer API将DOM树重新写回到XML文件中。

方法二:使用XPath编程

XPath是一种XML的查询语言,通常用来在XML文档中查询满足特定条件的节点。XPath不仅适用于查询操作,而且也可用于添加、删除、更新XML文档中的节点。

示例一:添加一个节点

与DOM相似,XPath也可以用来添加XML文档中的节点。接下来看一个添加price节点到每个book节点下的示例:

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class AddNodeXPath {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory docFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder =
         docFactory.newDocumentBuilder();
         Document document = docBuilder.parse(inputFile);

         // 创建一个XPath对象
         XPathFactory xpathFactory = XPathFactory.newInstance();
         XPath xpath = xpathFactory.newXPath();

         // 找到所有book节点
         String expression = "/catalog/book";
         NodeList nodeList = (NodeList) xpath.compile(expression).evaluate(
         document, XPathConstants.NODESET);

         // 在每个book节点中添加price节点
         for (int i = 0; i < nodeList.getLength(); i++) {
            Element bookElement = (Element) nodeList.item(i);
            Element priceElement = document.createElement("price");
            priceElement.appendChild(
            document.createTextNode("29.99"));
            bookElement.appendChild(priceElement);
         }

         // 将更新写回到XML文件中
         TransformerFactory transformerFactory =
         TransformerFactory.newInstance();
         Transformer transformer =
         transformerFactory.newTransformer();
         DOMSource source = new DOMSource(document);
         StreamResult result =
         new StreamResult(new File("output.xml"));
         transformer.transform(source, result);

      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

在上面的示例代码中,我们使用XPath查询表达式“/catalog/book”找到了所有book节点,并使用createElement()方法创建了一个新的price节点。在创建完成后,我们使用appendChild()方法将其添加到相应的book节点下。最后,我们使用Transformer API将DOM树重新写回到XML文件中。

示例二:替换一个节点

与DOM一样,XPath也可用于替换XML文档中的节点。接下来看一个替换XML文档中的学生节点的示例:

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class ReplaceNodeXPath {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory docFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder =
         docFactory.newDocumentBuilder();
         Document document = docBuilder.parse(inputFile);

         // 创建一个XPath对象
         XPathFactory xpathFactory = XPathFactory.newInstance();
         XPath xpath = xpathFactory.newXPath();

         // 查找id为001的学生节点
         String expression = "/class/student[@id='001']";
         Node studentNode = (Node) xpath.compile(expression).evaluate(
         document, XPathConstants.NODE);

         // 创建新的学生节点
         Element newStudent = document.createElement("student");
         newStudent.setAttribute("id", "001");
         Element name = document.createElement("name");
         name.appendChild(document.createTextNode("John"));
         newStudent.appendChild(name);
         Element gender = document.createElement("gender");
         gender.appendChild(document.createTextNode("male"));
         newStudent.appendChild(gender);
         Element age = document.createElement("age");
         age.appendChild(document.createTextNode("25"));
         newStudent.appendChild(age);
         Element email = document.createElement("email");
         email.appendChild(document.createTextNode("john@example.com"));
         newStudent.appendChild(email);

         // 用新的节点替换旧的节点
         studentNode.getParentNode().replaceChild(newStudent, studentNode);

         // 将更新后的Dom树写回到XML文件中
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         DOMSource source = new DOMSource(document);
         StreamResult result = new StreamResult(new File("output.xml"));
         transformer.transform(source, result);

      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

在上面的示例代码中,我们首先使用XPath查询表达式“/class/student[@id='001']”找到id为001的学生节点。在查找完成后,我们使用createElement()方法创建了一个新的学生节点,并使用replaceChild()方法将旧节点替换成新节点。最后,我们使用Transformer API将DOM树重新写回到XML文件中。

以上就是Java编程中更新XML文档的常用方法了。在实际应用中,还需要考虑XML文件的大小、结构以及更新的频率等因素来选择合适的方法。

本文标题为:Java编程中更新XML文档的常用方法

基础教程推荐