我们在此只是举一个简单的xml内容的解析实例,来学习一下在android开发的过程当中,针对xml内容比较常见的两种解析方式。其实也对应于iOS开发中的Dom解析和Sax解析。
下面是一个xml文本
<apps>
<app>
<id>1</id>
<name>Google</name>
<version>1.1</version>
</app>
<app>
<id>2</id>
<name>Iphone</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Mac</name>
<version>3.1</version>
</app>
</apps>
Pull解析方式
以下是具体的实现过程,内容很简单,不做过多的解释,相关细节在代码中注释标出。
public void parserXmlWithpull(){
String domStr ="<apps><app><id>1</id><name>Google</name><version>1.1</version></app><app><id>2</id><name>Iphone</name><version>2.0</version></app><id>3</id><name>Mac</name><version>3.2</version><app></app></apps>";
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(domStr));
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
while (eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch (eventType){
//开始解析某个节点的时候
case XmlPullParser.START_TAG:
{
if ("id".equals(nodeName)){
id = xmlPullParser.nextText();
}else if ("name".equals(nodeName)){
name = xmlPullParser.nextText();
}else if ("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
}
break;
//完成解析某个节点
case XmlPullParser.END_TAG:
{
if ("app".equals(nodeName)){
Toast.makeText(MainActivity.this,"name = "+name+" version="+version,Toast.LENGTH_LONG).show();
}
}
break;
default:
break;
}
eventType = xmlPullParser.next();
}
}catch (Exception e){
e.printStackTrace();
}
}
Sax解析方式
Sax解析相对Pull解析稍微复杂了一丁点,主要是多出了几个方法需要实现,但并不难。
首先,我们需要创建一个类,继承自DefaultHandler,我们在此创建了一个CustomeHandle类,并实现相关方法, 其大致过程也是一目了然。
public class CustomeHandle extends DefaultHandler{
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
/*
* 开始Xml解析的时候会调用
* */
@Override
public void startDocument() throws SAXException {
super.startDocument();
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
/*
* 开始解析某个节点的时候调用
* */
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//记录当前节点的名称
nodeName = localName;
}
/*
* 获取节点中的内容
* */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//根据当前节点名称判断将内容添加到哪一个StringBuilder中
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 {
super.endElement(uri, localName, qName);
if ("app".equals(localName)){
Toast.makeText(MainActivity.this,"id="+id+" name="+name+" version"+version,Toast.LENGTH_LONG).show();
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
/*
* 结束xml解析的时候调用
* */
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
以上,我们只是创建了一个类CustomeHandle,但并未实现解析。下面是运用CustomeHandle类实现解析的过程。
public void parserXmlWithSax() {
String domStr ="<apps><app><id>1</id><name>Google</name><version>1.1</version></app><app><id>2</id><name>Iphone</name><version>2.0</version></app><id>3</id><name>Mac</name><version>3.2</version><app></app></apps>";
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
CustomeHandle handle = new CustomeHandle();
//将CustomeHandle到实例设置到XMLReader中
reader.setContentHandler(handle);
reader.parse(new InputSource(new StringReader(domStr)));
}catch (Exception e){
e.printStackTrace();
}
}
网友评论