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
包中。