目录

  1. XML 基础知识简介
  2. Java 处理 XML 的方式
  3. DOM 解析(树形解析)详解与示例
  4. SAX 解析(事件驱动解析)详解与示例
  5. StAX 解析(拉式解析)介绍
  6. JAXB(Java Architecture for XML Binding)详解
  7. 读取和写入 XML 的基本示例
  8. 常用第三方库推荐
  9. 小结与最佳实践

1. XML 基础知识简介

  • XML (eXtensible Markup Language) 是一种用于存储和传输数据的标记语言,格式类似HTML,但专注于数据描述。
  • 结构由标签和属性组成,支持嵌套,数据自描述性强。
  • 示例:
<person>
  <name>张三</name>
  <age>30</age>
  <email>zhangsan@example.com</email>
</person>

2. Java 处理 XML 的方式

Java 标准库和第三方库支持多种解析方式,主要包括:

  • DOM(Document Object Model)
    载入整个 XML 到内存,形成树形结构,操作灵活,但内存开销大。
  • SAX(Simple API for XML)
    事件驱动,逐行解析,内存占用低,适合大文件,但编程较复杂。
  • StAX(Streaming API for XML)
    拉式解析,结合了 DOM 和 SAX 的优点,程序控制解析进度。
  • JAXB(Java Architecture for XML Binding)
    面向对象的绑定,自动将 XML 映射为 Java 类,读写更便捷。

3. DOM 解析详解与示例

  • 解析时,Java 将 XML 文档加载成树形结构,允许任意访问节点。

示例代码:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;
import java.io.File;

public class DomParserDemo {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("person.xml");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(xmlFile);
            doc.getDocumentElement().normalize();

            System.out.println("根节点:" + doc.getDocumentElement().getNodeName());

            NodeList nList = doc.getElementsByTagName("person");
            for (int i = 0; i < nList.getLength(); i++) {
                Element person = (Element) nList.item(i);
                String name = person.getElementsByTagName("name").item(0).getTextContent();
                String age = person.getElementsByTagName("age").item(0).getTextContent();
                System.out.println("姓名:" + name + ", 年龄:" + age);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. SAX 解析详解与示例

  • 通过事件回调方式处理 XML,节省内存。

示例代码:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import java.io.File;

public class SaxParserDemo extends DefaultHandler {
    private String currentValue;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equalsIgnoreCase("person")) {
            System.out.println("开始解析 person 元素");
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        currentValue = new String(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equalsIgnoreCase("name")) {
            System.out.println("姓名:" + currentValue);
        } else if(qName.equalsIgnoreCase("age")) {
            System.out.println("年龄:" + currentValue);
        }
    }

    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            SaxParserDemo handler = new SaxParserDemo();
            parser.parse(new File("person.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. StAX 解析介绍

  • StAX 解析器使用拉取方式,程序可控制何时拉取事件,适合高性能需求。

6. JAXB 详解

  • JAXB 可以把 XML 直接转换成 Java 类,反之亦然。
  • 需定义符合 XML 结构的 Java Bean 类,使用注解绑定。

示例:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {
    private String name;
    private int age;

    // getter 和 setter 省略
}
  • 使用 JAXBContext 和 Marshaller / Unmarshaller 实现对象与 XML 互转。

7. 读取与写入 XML 示例

写入 XML(DOM)

// 生成简单的 XML 文档,并写入文件

(此处可具体扩展代码)


8. 常用第三方库推荐

库名说明
JAXBJava 官方 XML-Object 绑定框架
Dom4j功能强大的树形 XML 解析工具
JDOM更加简洁的 DOM 操作API
XStream简单的对象与 XML 转换工具
Jackson XMLJackson JSON 生态系统支持 XML

9. 小结与最佳实践

  • 小文件或需要随机访问用 DOM;
  • 大文件用 SAX 或 StAX;
  • 业务对象映射建议用 JAXB 或第三方库简化开发;
  • 注意字符编码和 XML 格式规范;
  • 结合具体场景选择合适解析方式。