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();
        }
    }
}

在上面的代码中,我们使用SAXParserFactorySAXParser类创建SAX解析器。然后,我们创建一个DefaultHandler的实例,其中定义了处理XML事件的方法。在这个例子中,我们只重写了startElementendElementcharacters方法,分别在开始元素、结束元素和文本节点时被调用。最后,我们使用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();
        }
    }
}

在上面的代码中,我们使用DocumentBuilderFactoryDocumentBuilder类创建DOM解析器。然后,我们使用parse方法将XML文档解析为一个Document对象。接下来,我们使用getElementsByTagName方法获取文档中的所有元素节点,并遍历这些节点。对于每个元素节点,我们打印出其标签名,并检查是否有属性。如果有属性,我们遍历这些属性并打印出其名称和值。对于文本节点,我们直接打印出其值。

SAX vs DOM

下表总结了SAX和DOM解析器的一些区别:

| 特性 | SAX解析器 | DOM解析器 | |--------------