SAX(Simple API for XML)是一个基于事件的 XML 文档解析器。与 DOM 解析器不同,SAX 解析器不创建解析树。SAX 是 XML 的流接口,这意味着使用 SAX 的应用程序接收有关正在处理的 XML 文档的事件通知、元素和属性,从文档顶部开始,以文档的结束结束。
- 从上到下读取 XML 文档
- 读取顺序与它们在文档中出现的顺序相同
它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小。
SAX解析会触发一系列事件:
- startDocument:开始读取XML文档;
- startElement:读取到了一个元素,例如<book>;
- characters:读取到了字符;
- endElement:读取到了一个结束的元素,例如</book>;
- endDocument:读取XML文档结束。
解析的具体操作
InputStream inputStream = new FileInputStream("book1.xml");
SAXParserFactory saxParserFactory = SAXParserFactory.newDefaultInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(inputStream,new MyHandler());
Handler
public class UserHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
@Override
public void startElement(String uri,
String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
String rollNo = attributes.getValue("rollno");
System.out.println("Roll No : " + rollNo);
} else if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
}
@Override
public void endElement(String uri,
String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
System.out.println("End Element :" + qName);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bFirstName) {
System.out.println("First Name: "
+ new String(ch, start, length));
bFirstName = false;
} else if (bLastName) {
System.out.println("Last Name: " + new String(ch, start, length));
bLastName = false;
} else if (bNickName) {
System.out.println("Nick Name: " + new String(ch, start, length));
bNickName = false;
} else if (bMarks) {
System.out.println("Marks: " + new String(ch, start, length));
bMarks = false;
}
}
}
网友评论