在Android应用开发中,操作XML文件是一项基础且常见的任务。无论是解析本地配置还是处理服务器返回的XML数据,开发者通常会在DOM、SAX和Pull这三种方式中选择。它们各有特点,适用于不同的业务场景。
一、DOM解析方法
DOM(Document Object Model)解析会把整个XML文档加载到内存中,构建成一棵节点树。我们可以通过节点关系随意访问和修改内容,比较直观。
下面是用DOM读取XML中节点文本的示例:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class DomDemo {
public static void parse(String xml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
NodeList list = doc.getElementsByTagName("name");
for (int i = 0; i < list.getLength(); i++) {
// 获取每个name节点的文本内容
String text = list.item(i).getTextContent();
System.out.println(text);
}
}
}
二、SAX解析方法
SAX(Simple API for XML)采用事件驱动模型,一边读一边触发回调,不会把整个文档放入内存,因此适合处理较大的XML文件。
使用SAX需要继承DefaultHandler,示例如下:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class SaxDemo extends DefaultHandler {
public static void parse(String xml) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")), new SaxDemo());
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attrs) {
// 遇到开始标签时触发
if ("name".equals(qName)) {
System.out.println("start name");
}
}
@Override
public void characters(char[] ch, int start, int length) {
// 接收元素内的字符数据
String data = new String(ch, start, length).trim();
if (!data.isEmpty()) {
System.out.println(data);
}
}
}
三、Pull解析方法
Pull解析也是事件模型,但由开发者主动调用next方法获取事件,逻辑更紧凑,是Android推荐的轻量方式。
使用XmlPullParser的简单示例:
import org.xmlpull.v1.*;
import java.io.ByteArrayInputStream;
public class PullDemo {
public static void parse(String xml) throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new ByteArrayInputStream(xml.getBytes("UTF-8")), "UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG && "name".equals(parser.getName())) {
// 读取下一个文本事件
parser.next();
System.out.println(parser.getText());
}
event = parser.next();
}
}
}
三种方式对比
| 方式 | 内存占用 | 是否可写 | 适用场景 |
|---|---|---|---|
| DOM | 高 | 支持 | 小文件、需修改 |
| SAX | 低 | 不支持 | 大文件只读 |
| Pull | 低 | 不支持 | 移动端通用解析 |
总结
在Android中操作XML,若文件小且要改动可选DOM;若关注性能和内存,大文件只读用SAX或Pull均可,其中Pull代码更直观。理解这三种方法有助于写出更稳健的解析逻辑。