Java XML解析 - SAX vs DOM
在Java开发中,我们经常需要处理XML数据。XML是一种用于描述数据的标记语言,它具有良好的结构和可读性。在Java中,我们有几种选择来解析XML文档,其中最常用的是SAX和DOM解析器。
SAX解析器
SAX(Simple API for XML)解析器是一种基于事件驱动的解析器。它逐行读取XML文档,并触发一系列的事件,让我们可以在事件发生时处理XML数据。SAX解析器适用于处理大型XML文档,因为它不会将整个文档加载到内存中。
下面是一个使用SAX解析器解析XML文档的示例代码:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXParserExample {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start Element: " + qName);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("End Element: " + qName);
}
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("Text: " + new String(ch, start, length));
}
};
saxParser.parse("example.xml", handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用SAXParserFactory
和SAXParser
类创建SAX解析器。然后,我们创建一个DefaultHandler
的实例,其中定义了处理XML事件的方法。在这个例子中,我们只重写了startElement
、endElement
和characters
方法,分别在开始元素、结束元素和文本节点时被调用。最后,我们使用parse
方法将XML文档解析为事件。
DOM解析器
DOM(Document Object Model)解析器将整个XML文档加载到内存中,并构建一个树形结构,我们可以通过操作这个树来访问和修改XML数据。相比SAX解析器,DOM解析器更适合处理小型XML文档。
下面是一个使用DOM解析器解析XML文档的示例代码:
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class DOMParserExample {
public static void main(String[] args) {
try {
File file = new File("example.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(file);
NodeList nodeList = document.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println("Element: " + node.getNodeName());
if (node.hasAttributes()) {
NamedNodeMap attributes = node.getAttributes();
for (int j = 0; j < attributes.getLength(); j++) {
Node attribute = attributes.item(j);
System.out.println("Attribute: " + attribute.getNodeName() + " = " + attribute.getNodeValue());
}
}
} else if (node.getNodeType() == Node.TEXT_NODE) {
System.out.println("Text: " + node.getNodeValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们使用DocumentBuilderFactory
和DocumentBuilder
类创建DOM解析器。然后,我们使用parse
方法将XML文档解析为一个Document
对象。接下来,我们使用getElementsByTagName
方法获取文档中的所有元素节点,并遍历这些节点。对于每个元素节点,我们打印出其标签名,并检查是否有属性。如果有属性,我们遍历这些属性并打印出其名称和值。对于文本节点,我们直接打印出其值。
SAX vs DOM
下表总结了SAX和DOM解析器的一些区别:
| 特性 | SAX解析器 | DOM解析器 | |--------------