使用Java DOM处理XML字符串
在Java中,可以使用DOM(Document Object Model)API来解析、操作和生成XML字符串,以下是完整的示例代码,展示如何从字符串创建XML文档、修改内容以及将文档转换回字符串。
将XML字符串解析为DOM文档
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
public class XmlDomExample {
public static void main(String[] args) {
String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 将字符串转换为输入流
ByteArrayInputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
// 解析XML字符串为DOM文档
Document document = builder.parse(inputStream);
// 处理文档...
processDocument(document);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void processDocument(Document document) {
// 获取根元素
Element root = document.getDocumentElement();
System.out.println("Root element: " + root.getNodeName());
// 获取所有person元素
NodeList personList = root.getElementsByTagName("person");
for (int i = 0; i < personList.getLength(); i++) {
Node personNode = personList.item(i);
if (personNode.getNodeType() == Node.ELEMENT_NODE) {
Element personElement = (Element) personNode;
// 获取属性
String id = personElement.getAttribute("id");
System.out.println("Person ID: " + id);
// 获取子元素
NodeList nameList = personElement.getElementsByTagName("name");
if (nameList.getLength() > 0) {
Element nameElement = (Element) nameList.item(0);
System.out.println("Name: " + nameElement.getTextContent());
}
NodeList ageList = personElement.getElementsByTagName("age");
if (ageList.getLength() > 0) {
Element ageElement = (Element) ageList.item(0);
System.out.println("Age: " + ageElement.getTextContent());
}
}
}
}
}
创建新的XML文档并转换为字符串
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 java.io.StringWriter;
public class CreateXmlDomExample {
public static void main(String[] args) {
try {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建新文档
Document document = builder.newDocument();
// 创建根元素
Element rootElement = document.createElement("root");
document.appendChild(rootElement);
// 创建person元素
Element personElement = document.createElement("person");
personElement.setAttribute("id", "1");
rootElement.appendChild(personElement);
// 创建name元素
Element nameElement = document.createElement("name");
nameElement.setTextContent("Alice");
personElement.appendChild(nameElement);
// 创建age元素
Element ageElement = document.createElement("age");
ageElement.setTextContent("25");
personElement.appendChild(ageElement);
// 将DOM文档转换为字符串
String xmlString = documentToString(document);
System.out.println("Generated XML:\n" + xmlString);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String documentToString(Document document) throws Exception {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 设置输出属性(可选)
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
return writer.toString();
}
}
修改现有XML文档并转换为字符串
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.Node;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
public class ModifyXmlDomExample {
public static void main(String[] args) {
String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
// 解析XML字符串
Document document = parseXmlString(xmlString);
// 修改文档
modifyDocument(document);
// 转换回字符串
String modifiedXml = documentToString(document);
System.out.println("Modified XML:\n" + modifiedXml);
} catch (Exception e) {
e.printStackTrace();
}
}
private static Document parseXmlString(String xml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes());
return builder.parse(inputStream);
}
private static void modifyDocument(Document document) {
// 修改年龄
NodeList ageList = document.getElementsByTagName("age");
if (ageList.getLength() > 0) {
Element ageElement = (Element) ageList.item(0);
ageElement.setTextContent("31");
}
// 添加新元素
Element root = document.getDocumentElement();
Element newPerson = document.createElement("person");
newPerson.setAttribute("id", "2");
Element newName = document.createElement("name");
newName.setTextContent("Bob");
newPerson.appendChild(newName);
Element newAge = document.createElement("age");
newAge.setTextContent("28");
newPerson.appendChild(newAge);
root.appendChild(newPerson);
}
private static String documentToString(Document document) throws Exception {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
return writer.toString();
}
}
关键点说明
- DocumentBuilderFactory:用于创建DocumentBuilder实例
- DocumentBuilder:负责解析XML字符串并创建DOM文档
- Document:表示整个XML文档的内存表示
- Element:表示XML元素
- NodeList:表示节点列表(如多个同名元素)
- Transformer:用于将DOM文档转换为字符串
注意事项
- 确保处理XML时正确处理异常
- 对于大型XML文件,DOM可能消耗较多内存,考虑使用SAX或StAX
- 在Java 7+中,可以使用try-with-resources来管理资源
- 如果需要处理命名空间,需要在DocumentBuilderFactory中设置相关属性
示例涵盖了使用Java DOM处理XML字符串的主要操作,包括解析、创建、修改和序列化。
