android xml解析

XML解析实战
本文介绍如何使用Pull和Sax两种方式解析XML文件,并提供详细的代码示例。通过对比这两种方法,帮助开发者选择最适合项目的XML解析方案。
1,要解析的xml文件文件

xml="<apps>\n" +
                "  <app>\n" +
                "    <id>1</id>\n" +
                "    <name>burn</name>\n" +
                "    <version>1.0</version>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "  </app>\n" +
                "  <app>\n" +
                "    <id>2</id>\n" +
                "    <name>burn2</name>\n" +
                "    <version>2.1</version>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "  </app>\n" +
                "  <app>\n" +
                "    <id>3</id>\n" +
                "    <name>burn3</name>\n" +
                "    <version>3.2</version>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "    <info>\n" +
                "      <size>10.5</size>\n" +
                "      <message>hhhhhhhh</message>\n" +
                "    </info>\n" +
                "  </app>\n" +
                "</apps>";

2,使用pull方式解析xml文件

private void parseXmlWithPull() {
try {
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
parser.setInput(new StringReader(xml));
int eventType=parser.getEventType();
String id="";
String name="";
String version="";
String size="";
String message="";
while (eventType!=parser.END_DOCUMENT){
String nodeName=parser.getName();
switch (eventType){
case XmlPullParser.START_TAG:
switch (nodeName){
case "id":
id=parser.nextText();
break;
case "name":
name=parser.nextText();
break;
case "version":
version=parser.nextText();
break;
case "size":
size=parser.nextText();
break;
case "message":
message=parser.nextText();
break;
default:
break;
}
break;
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)){
Log.e("tag","id:"+id);
Log.e("tag","name:"+name);
Log.e("tag","version:"+version);
}else if ("info".equals(nodeName)){
Log.e("tag","size:"+size);
Log.e("tag","message:"+message);
}
break;
default:
break;
}
eventType=parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

3,使用sax方式解析xml文件

private void parseXmlWithSax(){
try {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader xmlReader=parser.getXMLReader();
ContentHandler ch=new ContentHandler();
xmlReader.setContentHandler(ch);
xmlReader.parse(new InputSource(new StringReader(xml)));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public class ContentHandler extends DefaultHandler {

//characters方法不是一次获取全部数据,所有要将数据拼接
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
private StringBuilder size;
private StringBuilder message;
private String nodeName;

@Override
public void startDocument() throws SAXException {
id=new StringBuilder();
name=new StringBuilder();
version=new StringBuilder();
size=new StringBuilder();
message=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 {
switch (nodeName){
case "id":
id.append(ch,start,length);
break;
case "name":
name.append(ch,start,length);
break;
case "version":
version.append(ch,start,length);
break;
case "size":
size.append(ch,start,length);
break;
case "message":
message.append(ch,start,length);
break;
default:
break;
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)){
//获取的数据中含有多余的空格和换行需要去掉
Log.e("tag","id:"+id.toString().trim());
Log.e("tag","name:"+name.toString().trim());
Log.e("tag","version:"+version.toString().trim());
//清空
id.setLength(0);
name.setLength(0);
version.setLength(0);
}else if ("info".equals(localName)){
Log.e("tag","size:"+size.toString().trim());
Log.e("tag","message:"+message.toString().trim());
size.setLength(0);
message.setLength(0);
}
}

@Override
public void endDocument() throws SAXException {
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值