目录
- XML 基础知识简介
- Java 处理 XML 的方式
- DOM 解析(树形解析)详解与示例
- SAX 解析(事件驱动解析)详解与示例
- StAX 解析(拉式解析)介绍
- JAXB(Java Architecture for XML Binding)详解
- 读取和写入 XML 的基本示例
- 常用第三方库推荐
- 小结与最佳实践
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. 常用第三方库推荐
库名 | 说明 |
---|---|
JAXB | Java 官方 XML-Object 绑定框架 |
Dom4j | 功能强大的树形 XML 解析工具 |
JDOM | 更加简洁的 DOM 操作API |
XStream | 简单的对象与 XML 转换工具 |
Jackson XML | Jackson JSON 生态系统支持 XML |
9. 小结与最佳实践
- 小文件或需要随机访问用 DOM;
- 大文件用 SAX 或 StAX;
- 业务对象映射建议用 JAXB 或第三方库简化开发;
- 注意字符编码和 XML 格式规范;
- 结合具体场景选择合适解析方式。
发表回复