文章目录
- 1.SAX 解析器
- 1)什么是 SAX
- 2)SAX 工作流程
- 初始化
- 实现事件处理类
- 解析
- 3)示例代码
- 2.DOM 解析器
- 1)什么是 DOM
- 2)DOM 工作流程
- 初始化
- 解析 XML 文档
- 操作 DOM 树
- 3)示例代码
- 总结
在项目开发中,XML 是一种常见的数据交换格式。为了处理和解析 XML 文档,Java 提供了两种主要的解析方式:SAX(Simple API for XML)和 DOM(Document Object Model)。
1.SAX 解析器
1)什么是 SAX
SAX 是一种基于事件的 XML 解析方式。它逐行的扫描 XML 文档,并在解析的过程中触发事件,允许程序对文档进行响应。由于 SAX 不需要将整个文档加载到内存中,因此适用于处理大型 XML 文件。
2)SAX 工作流程
初始化
创建 SAXParserFactory
实例,并通过它创建 SAXParser
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
实现事件处理类
创建一个类,实现 org.xml.sax.helpers.DefaultHandler
类或其子类,重写需要处理的事件方法
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class HandlerDemo extends DefaultHandler {
@Override
public void startElement(String uri, String localName
, String qName, Attributes attributes) throws SAXException {
// 处理元素开始事件
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 处理元素文本事件
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// 处理元素结束事件
}
}
解析
使用 SAXParser
解析 XML 文档,并将事件处理类注册到解析器中
HandlerDemo handler = new HandlerDemo();
saxParser.parse("example.xml", handler);
3)示例代码
example.xml
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>cheney</name>
<age>18</age>
</student>
Demo.java
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception {
// 1. 初始化
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
// 2. 实现事件处理类
DefaultHandler handler = new DefaultHandler() {
@Override
public void startElement(String uri
, String localName, String qName, Attributes attributes) {
System.out.println("元素开始: " + qName);
}
@Override
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length).trim();
if (!"".equals(str)) {
System.out.println("元素文本: " + str);
}
}
@Override
public void endElement(String uri, String localName, String qName) {
System.out.println("元素结束: " + qName);
}
};
// 3. 解析
String path = "D:\\workspace\\demo\\src\\main\\resources\\example.xml";
saxParser.parse(new File(path), handler);
}
}
输出结果:
元素开始: student
元素开始: name
元素文本: cheney
元素结束: name
元素开始: age
元素文本: 18
元素结束: age
元素结束: student
2.DOM 解析器
1)什么是 DOM
DOM 是一种基于树结构的 XML 解析方式。它将整个 XML 文档加载到内存中,并形成一个树形结构,允许通过节点的方式访问和修改文档的内容。DOM 解析器适用于需要频繁随机访问 XML 数据的情况。
2)DOM 工作流程
初始化
创建 DocumentBuilderFactory
实例,并通过它创建 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
解析 XML 文档
使用 DocumentBuilder
解析 XML 文档,得到 Document
对象
Document document = docBuilder.parse("example.xml");
操作 DOM 树
使用 Document 对象进行节点的增删改查操作。
// 获取根元素
Element root = document.getDocumentElement();
// 获取名为 "element" 的所有节点
NodeList nodeList = root.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
System.out.println("学生信息: " + element.getTextContent());
}
}
3)示例代码
example.xml
<students>
<student>
<name>cheney</name>
<age>18</age>
</student>
</students>
Demo.java
mport org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception{
// 1. 初始化
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
// 2. 解析
String path = "D:\\workspace\\demo\\src\\main\\resources\\example.xml";
Document document = docBuilder.parse(new File(path));
// 3. 操作 DOM 树
Element root = document.getDocumentElement();
NodeList nodeList = root.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
System.out.println("学生信息: " + element.getTextContent());
}
}
}
}
输出结果:
学生信息:
cheney
18
总结
解析 XML 文件的解析器有 SAX 解析器 和 DOM 解析器 两种不同方式,各自有适用的场景。SAX 适用于大型 XML 文件,它基于事件的方式逐行解析,不需要将整个文档加载到内存。DOM 适用于需要随机访问 XML 数据的情况,它将整个文档加载到内存形成树状结构,允许直接操作节点。在选择解析方式时,需根据具体需求和文档大小来选择适当的解析器。