Android编程简易实现XML解析的方法详解
本文实例讲述了android编程简易实现xml解析的方法。分享给大家供大家参考,具体如下:
首先创建在android工程中创建一个assets文件夹 app/src/main/assets
在这里添加一个名为 data.xml的文件,然后编辑这个文件,加入如下xml格式内容
<?xml version="1.0" encoding="utf-8"?> <apps> <app> <id>1</id> <name>google maps</name> <version>1.0</version> </app> <app> <id>2</id> <name>chrome</name> <version>2.1</version> </app> <app> <id>3</id> <name>google play</name> <version>2.3</version> </app> </apps>
==============获取xml中内容================
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); try { //获取xml文件的输入流 inputstream fis = getresources().getassets().open("data.xml"); inputstreamreader isr = new inputstreamreader(fis, "utf-8"); stringbuffer stringbuffer = new stringbuffer(); int mark = -1; while ((mark = isr.read()) != -1) { stringbuffer.append((char) mark); } string data = stringbuffer.tostring(); //把整个文件内容以string方式传入 //parsexmlwithpull(data); //parsexmlwithsax(data); } catch (ioexception e) { e.printstacktrace(); } }
==============pull解析方式=================
获取解析工具xmlpullparser:
xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); xmlpullparser xmlpullparser = factory.newpullparser();
传入xml字符流:
xmlpullparser.setinput(new stringreader(xmldata));
根据节点特征进行处理:
switch ( xmlpullparser.geteventtype() )
private void parsexmlwithpull(string xmldata) { try { xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); xmlpullparser xmlpullparser = factory.newpullparser(); xmlpullparser.setinput(new stringreader(xmldata)); 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)) { log.d("woider", "id is " + id); log.d("woider", "name is " + name); log.d("woider", "version is " + version); } } break; } eventtype = xmlpullparser.next(); } } catch (exception e) { e.printstacktrace(); } }
==============sax解析方式=================
使用sax解析通常需要创建一个类继承defaulthandler,并重写父类的五个方法
startdocument()
:开始xml解析的时候调用startelement()
:开始解析某个结点的时候调用characters()
:获取节点中内容的时候调用endelement()
:完成解析某个节点的时候调用enddocument()
:完成整个xml解析的时候调用
public class contenthandler 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 { //进行格式规范化 string str = new string(ch, start, length).trim(); //根据当前节点名添加内容 if ("id".equals(nodename)) { id.append(str); } else if ("name".equals(nodename)) { name.append(str); } else if ("version".equals(nodename)) { version.append(str); } } @override public void endelement(string uri, string localname, string qname) throws saxexception { if ("app".equals(localname)) { log.d("woider", "id is " + id); log.d("woider", "name is " + name); log.d("woider", "version is " + version); //清空stringbuilder id.setlength(0); name.setlength(0); version.setlength(0); } } @override public void enddocument() throws saxexception { } }
获取解析工具xmlreader:
saxparserfactory factory = saxparserfactory.newinstance(); xmlreader xmlreader = factory.newsaxparser().getxmlreader();
传入规则到解析工具:
contenthandler handler = new contenthandler(); xmlreader.setcontenthandler(handler);
开始执行解析:
xmlreader.parse(new inputsource(new stringreader(xmldata)));
private void parsexmlwithsax(string xmldata) { try { saxparserfactory factory = saxparserfactory.newinstance(); xmlreader xmlreader = factory.newsaxparser().getxmlreader(); contenthandler handler = new contenthandler(); //将contenthandler的实例设置到xmlreader中 xmlreader.setcontenthandler(handler); //开始执行解析 xmlreader.parse(new inputsource(new stringreader(xmldata))); } catch (exception e) { e.printstacktrace(); } }
方法二(直接针对inputstream解析)
获取解析工具saxparser:
saxparserfactory factory = saxparserfactory.newinstance(); saxparser parser = factory.newsaxparser();
获取规则和输入流:
handler = new parserhandler(); inputstream inputstream = getresources().getassets().open("data.xml");
同时传入开始解析:
parser.parse(inputstream, handler);
最后打印 logcat 中的日志,data.xml的解析就完成了
除了 pull 解析和 sax 解析之外,还有一种 dom 解析也非常重要。
另外还有一些xml解析工具,比如 jdom 和 dom4j,它们简化了解析的步骤,提高了解析的效率。
ps:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线xml/json互相转换工具:
在线格式化xml/在线压缩xml:
xml在线压缩/格式化工具:
xml代码在线格式化美化工具:
更多关于android相关内容感兴趣的读者可查看本站专题:《android操作xml数据技巧总结》、《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。