Java中读写XML文件内容通常涉及到DOM(文档对象模型)和SAX(简单API for XML)两种方式,以下是使用这两种方式读写XML文件的基本步骤和示例代码。

使用DOM解析和读写XML文件
DOM解析是一种基于树形结构的解析方式,它将整个XML文档加载到内存中,形成一个树形结构,便于遍历和修改。
读取XML文件
- 创建
DocumentBuilderFactory实例。 - 使用
DocumentBuilder实例解析XML文件。 - 使用
Document对象访问XML元素。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMReader {
public static void readXML(String filePath) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(filePath);
NodeList nodeList = document.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String name = element.getElementsByTagName("name").item(0).getTextContent();
String age = element.getElementsByTagName("age").item(0).getTextContent();
System.out.println("Name: " + name + ", Age: " + age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
写入XML文件
- 创建
DocumentBuilderFactory实例。 - 使用
DocumentBuilder实例创建Document对象。 - 创建XML元素并设置属性和子元素。
- 使用
Transformer将Document对象写入XML文件。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DOMWriter {
public static void writeXML(String filePath) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("students");
document.appendChild(root);
Element student = document.createElement("student");
root.appendChild(student);
Element name = document.createElement("name");
name.appendChild(document.createTextNode("John Doe"));
student.appendChild(name);
Element age = document.createElement("age");
age.appendChild(document.createTextNode("25"));
student.appendChild(age);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(filePath));
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析和读写XML文件
SAX解析是一种基于事件的解析方式,它逐个读取XML元素,并在读取到特定元素时触发事件。
读取XML文件
- 创建
XMLReader实例。 - 使用
ContentHandler处理XML元素。 - 在
ContentHandler中实现startElement、endElement和characters方法。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SAXReader {
public static void readXML(String filePath) {
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("student".equals(qName)) {
System.out.println("Student element started");
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("student".equals(qName)) {
System.out.println("Student element ended");
}
}
public void characters(char ch[], int start, int length) throws SAXException {
String content = new String(ch, start, length);
if (!content.trim().isEmpty()) {
System.out.println("Content: " + content);
}
}
};
xmlReader.setContentHandler(handler);
xmlReader.parse(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
写入XML文件
SAX解析主要用于读取XML文件,不适用于写入,通常使用DOM或JAXB(Java Architecture for XML Binding)等技术来写入XML文件。

FAQs
Q1:为什么选择DOM或SAX解析XML文件?
A1: DOM解析适用于需要频繁修改XML文档的场景,因为它将整个文档加载到内存中,便于遍历和修改,SAX解析适用于处理大型XML文件或需要事件驱动的场景,因为它逐个读取元素,不将整个文档加载到内存中。
Q2:如何处理XML文件中的命名空间?

A2: 在DOM解析中,可以使用Element.getNamespaceURI()和Element.getLocalName()方法获取命名空间URI和本地名称,在SAX解析中,可以在startElement方法中使用uri参数获取命名空间URI,在处理命名空间时,需要确保正确解析和引用元素。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/198340.html