XML 的 SAX 解析
时间: 2024-05-03 21:18:06 浏览: 16
SAX(Simple API for XML)是一种基于事件驱动的解析方式,与 DOM(Document Object Model)解析方式不同,它不需要将整个 XML 文档加载到内存中,而是在解析过程中,遇到节点、属性等事件时触发相应的回调函数进行处理,因此 SAX 解析方式更适合处理大型 XML 文档和流式数据。
SAX 解析方式包含以下步骤:
1. 创建一个 SAXParserFactory 对象。
2. 通过 SAXParserFactory 对象的 newSAXParser() 方法创建一个 SAXParser 对象。
3. 创建一个继承自 DefaultHandler 的类,用于处理 SAX 事件。
4. 通过 SAXParser 对象的 parse() 方法解析 XML 文档,并将处理 SAX 事件的类作为参数传入。
5. 在处理 SAX 事件的类中,重写相应的回调函数,如 startElement()、endElement()、characters() 等,根据事件类型进行相应的处理。
下面是一个使用 SAX 解析方式解析 XML 文档的示例代码:
```java
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class SAXParserDemo {
public static void main(String[] args) throws Exception {
// 创建 SAXParserFactory 对象
SAXParserFactory factory = SAXParserFactory.newInstance();
// 创建 SAXParser 对象
SAXParser parser = factory.newSAXParser();
// 创建处理 SAX 事件的类
MyHandler handler = new MyHandler();
// 解析 XML 文档
parser.parse("example.xml", handler);
}
}
class MyHandler extends DefaultHandler {
// 处理元素开始事件
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start element: " + qName);
// 处理元素属性
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println("Attribute: " + attributes.getQName(i) + " = " + attributes.getValue(i));
}
}
// 处理元素结束事件
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 {
String text = new String(ch, start, length).trim();
if (!text.isEmpty()) {
System.out.println("Text: " + text);
}
}
}
```
在上面的示例代码中,我们通过继承自 DefaultHandler 的 MyHandler 类来处理 SAX 事件,重写了 startElement()、endElement() 和 characters() 函数来分别处理元素开始、元素结束和字符数据事件。在 startElement() 函数中,我们还处理了元素属性,通过 Attributes 对象获取了所有属性的名称和值。在 main() 函数中,我们使用 SAXParser 对象的 parse() 方法解析了 XML 文档,并将处理 SAX 事件的 MyHandler 类作为参数传入。