当需要更新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文档的常用方法 - Python技术站