XML Pull Parser(使用Android的XmlPullParser)
原理
Pull Parser允许应用程序代码从XML数据中“拉取”事件,而不是像SAX那样通过事件处理程序被“推送”。应用程序代码可以决定何时拉取下一个事件,如开始元素、结束元素或文本内容。
优点
- 高效内存使用:不需要加载整个文档到内存中。
- 控制权:应用程序可以控制解析过程。
缺点
- 与平台绑定:如Android的XmlPullParser,它并非Java标准库的一部分。
Java代码示例(Android)
| import org.xmlpull.v1.XmlPullParser;  | |
| import org.xmlpull.v1.XmlPullParserException;  | |
| import java.io.StringReader;  | |
| public class XmlPullParserExample {  | |
| public void parseXml(String xmlString) throws XmlPullParserException, IOException {  | |
| XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  | |
| factory.setNamespaceAware(true);  | |
| XmlPullParser xpp = factory.newPullParser();  | |
| xpp.setInput(new StringReader(xmlString));  | |
| int eventType = xpp.getEventType();  | |
| String tagName = null;  | |
| while (eventType != XmlPullParser.END_DOCUMENT) {  | |
| switch (eventType) {  | |
| case XmlPullParser.START_TAG:  | |
| tagName = xpp.getName();  | |
| // 处理开始标签  | |
| break;  | |
| case XmlPullParser.END_TAG:  | |
| tagName = xpp.getName();  | |
| // 处理结束标签  | |
| break;  | |
| case XmlPullParser.TEXT:  | |
| // 处理文本内容  | |
| break;  | |
| // 其他情况...  | |
| }  | |
| eventType = xpp.next();  | |
| }  | |
| }  | |
| } | 
SAX Parser
原理
SAX Parser是一个基于事件的解析器,它读取XML文档并触发一系列事件,如开始元素、结束元素和字符数据。应用程序需要实现一个ContentHandler接口来处理这些事件。
优点
- 高效内存使用:不需要加载整个文档到内存中。
- 适用于大型XML文件。
缺点
- 编程模型复杂:需要编写事件处理代码。
- 不能回溯或修改解析的数据。
Java代码示例
| 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 SaxParserExample extends DefaultHandler {  | |
| @Override  | |
| public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  | |
| // 处理开始标签  | |
| }  | |
| @Override  | |
| public void endElement(String uri, String localName, String qName) throws SAXException {  | |
| // 处理结束标签  | |
| }  | |
| @Override  | |
| public void characters(char[] ch, int start, int length) throws SAXException {  | |
| // 处理文本内容  | |
| }  | |
| public void parseXml(String xmlString) throws SAXException, IOException, ParserConfigurationException {  | |
| SAXParserFactory factory = SAXParserFactory.newInstance();  | |
| SAXParser parser = factory.newSAXParser();  | |
| parser.parse(new InputSource(new StringReader(xmlString)), this);  | |
| }  | |
| } | 
注意:上述代码中的InputSource类需要从javax.xml.transform.stream.InputSource导入,并且你需要处理ParserConfigurationException异常。同时,SAXParser和SAXParserFactory都位于javax.xml.parsers包中。










