XML Pull解析器是一种基于事件驱动的XML解析方式,但它采用的是拉取模型。程序通过循环主动调用解析器的方法来获取下一个解析事件,比如开始标签、文本内容或结束标签。它与DOM和SAX在设计理念和使用方式上有明显区别,理解这些区别有助于我们在不同项目中做出合适的选择。

什么是XML Pull解析器
XML Pull解析器的核心思想是让使用者控制解析节奏。常用的实现有XmlPullParser,在Android开发中非常普遍。你不需要像SAX那样注册监听器,而是自己写循环不断拉取事件。
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.StringReader;
public class PullDemo {
public static void main(String[] args) throws Exception {
String xml = "<user><name>Tom</name><age>20</age></user>";
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xml));
int event = parser.getEventType();
// 主动拉取事件直到文档结束
while (event != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG) {
System.out.println("开始标签:" + parser.getName());
} else if (event == XmlPullParser.TEXT) {
System.out.println("文本:" + parser.getText());
}
event = parser.next();
}
}
}
DOM解析的特点
DOM即文档对象模型,它会把整个XML文件读入内存,构建一个节点树。你可以随意遍历、修改节点,但代价是内存占用大,文件很大时容易溢出。
| 解析方式 | 内存占用 | 随机访问 |
|---|---|---|
| DOM | 高 | 支持 |
| SAX | 低 | 不支持 |
| Pull | 低 | 不支持 |
SAX解析的特点
SAX使用推模型,解析器在读取XML时主动调用你注册的回调函数,比如startElement和endElement。你无法中途停止,只能等它解析完或抛异常。
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.InputSource;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.StringReader;
public class SaxDemo {
public static void main(String[] args) throws Exception {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new InputSource(new StringReader("<user><name>Tom</name></user>")),
new DefaultHandler() {
public void startElement(String uri, String local, String qName, Attributes attr) {
System.out.println("开始:" + qName);
}
});
}
}
Pull与SAX和DOM的核心不同
控制流差异
DOM是一次性加载,SAX是被动推,Pull是主动拉。使用XmlPullParser.next()这类方法,你能在读到感兴趣的数据后直接退出循环。
内存与适用场景
- DOM适合小文件且需要反复修改结构的场景
- SAX适合只需要顺序读取且不想自己控制循环的简单处理
- Pull适合移动端、流式解析和大文件顺序读取
简单说,如果你希望代码像读文件一样逐步读XML,并且随时可停,XML Pull解析器是最直观的方案。
小结
XML Pull解析器用拉取模型填补了SAX不够灵活和DOM太占内存之间的空白。掌握它之后,面对不同体积的XML数据和不同运行环境,你就能更从容地选型。