import java.io.InputStream;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SaxDemo implements XmlDocument { public SaxDemo() {} Override public...
Java解析XML的常用几种方法二 SAX的方式
SAX是一种事件驱动的解析方式。当解析器发现元素开始、元素结束、文本、文档的开始或结束等事件时,会触发相应的事件处理程序。程序员需要编写代码来响应这些事件,以便处理和保存数据。这种方式的优点在于,它不需要一次性加载整个文档,因此占用的资源较少,特别适合Applet或内存资源有限的环境。此外,SAX解析器的代码量通常比DOM解析器更少,这使得它在Applet中下载和运行更加高效。
然而,SAX也有其缺点。首先,它不是持久的,即事件过后,如果没有保存数据,那么数据将丢失。其次,SAX是无状态的,无法保存解析过程中的状态信息。此外,通过事件只能获取到文本内容,但无法直接知道该文本属于哪个元素。因此,如果需要获取元素层次结构或属性信息,SAX可能不是最佳选择。
SAX最适合用于处理大型XML文档或仅需访问文档的部分内容的场景。例如,当仅需要处理某个特定元素的内容时,SAX可以避免加载整个文档,从而节省资源。在Applet或内存资源受限的环境中,SAX的轻量级特性使其成为理想的选择。
下面是一个简单的SAX解析器示例代码,用于解析XML文件:
package com.davidw.xml.sax;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxDemo implements XmlDocument {
public SaxDemo() {}
@Override
public void createXML(String fileName) { }
@Override
public void parseXML(String fileName) {
SAXParserFactory saxpf = SAXParserFactory.newInstance();
try {
SAXParser parser = saxpf.newSAXParser();
InputStream is = new FileInputStream(fileName);
parser.parse(is, new MySAXHandler());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MySAXHandler extends DefaultHandler {
boolean hasAttr = false;
Attributes attributes = null;
public void startDocument() throws SAXException {
System.out.println("文档开始打印!");
}
public void endDocument() throws SAXException {
System.out.println("文档解析结束!");
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("employees")) { return; }
if (qName.equals("employee")) {
System.out.println(qName);
}
if (attributes.getLength() > 0) {
this.attributes = attributes;
this.hasAttr = true;
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (hasAttr && (attributes != null)) {
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println("属性名称: " + attributes.getQName(i) + ",属性值: " + attributes.getValue(i));
}
}
}
}
此代码定义了一个名为SaxDemo的类,它实现了XmlDocument接口。parseXML方法使用SAXParserFactory和SAXParser来解析指定的XML文件,并使用自定义的MySAXHandler处理解析事件。MySAXHandler类继承自DefaultHandler,并重写了startElement和endElement方法来处理元素开始和结束事件。2024-12-01