最近在学习android方面的知识,今天看到了关于使用PULL和SAX两种不同方式解析xml文件,在这里简单总结一下。
SAX是一种基于“推”的解析方式,它是自动将事件推入注册的事件处理器进行处理,所以你不能控制事件处理的主动结束。在使用SAX方式解释xml文档时,它不会一次将整个的文档读入内存在进行解析,而是在我们读取文档的过程中就对它进行解析,但是SAX在解析xml文档时,还是要遍历完毕文档中的所有节点的。所以当我们需要某一个xml文档中的前边某一部分时,如果我们采用这种方式的话,会十分浪费资源。
PULL是一种基于“拉”的解析方式,应用程序可以根据我们自己的需要来控制解析器的读取。我们可以让应用程序代码主动从解析器中获取事件,这样的话当我们获取到满足我们需要的内容后,就可以结束解析。
下面是关于两种方式解析xml文件的简单例子
1.需要解析的xml文件如下:
<apps>
<app>
<id>1</id>
<name>a</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>b</name>
<version>1.1</version>
</app>
</apps>
2.使用PULL方式解析xml文件
//使用pull方式解析xml格式数据
private void parseXMLWithPull(String xmlData){
String id = "";
String name = "";
String version = "";
try {
//创建一个pull解析器
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlData));
//获取文档的当前位置
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
//得到属性标记
String nodeName = parser.getName();
switch (eventType){
//开始解析某个节点
case XmlPullParser.START_TAG:
if("id".equals(nodeName)){
id = parser.nextText();
}else if("name".equals(nodeName)){
name = parser.nextText();
}else if("version".equals(nodeName)){
version = parser.nextText();
}
break;
//完成解析某个节点
case XmlPullParser.END_TAG:
if("app".equals(nodeName)){
Log.d("Main2Activity",id);
Log.d("Main2Activity", name);
Log.d("Main2Activity", version);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.使用SAX方式解析xml文件
public class MyHandler extends DefaultHandler{
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if("id".equals(nodeName)){
id.append(ch, start, length);
}else if("name".equals(nodeName)){
name.append(ch, start, length);
}else if("version".equals(nodeName)){
version.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("app".equals(nodeName)){
Log.d("ContentHandler", id.toString());
Log.d("ContentHandler", name.toString());
Log.d("ContentHandler", version.toString());
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
//使用SAX方式解析xml文件
private void parseXMLWithSax(String xmlData){
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = null;
try {
xmlReader = factory.newSAXParser().getXMLReader();
MyHandler myHandler = new MyHandler();
xmlReader.setContentHandler(myHandler);
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch (Exception e){
e.printStackTrace();
}
}