Android 创建与解析XML(四)——详解Pull方式
1、pull概述
android系统中和创建xml相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建xml的 xmlserializer,还提供了用来解析xml的pull方式解析器 xmlpullparser
xmlserializer没有像xmlpullparser那样提取xml事件,而是把它们推出到数据流outputstream或writer中。
xmlserializer提供了很直观的api,即使用startdocument开始文档,enddocument结束文档,starttag开始元素,endtag结束元素,text添加文本等。
pull方式创建xml,应用了标准xml构造器 org.xmlpull.v1.xmlserializer来创建 xml ,org.xmlpull.v1.xmlpullparser来解析xml,需要导入以下内容
org.xmlpull.v1
- org.xmlpull.v1.xmlpullparser;
- org.xmlpull.v1.xmlpullparserexception;
- org.xmlpull.v1.xmlpullparserfactory;
- org.xmlpull.v1.xmlserializer;
pull 创建和解析 xml 的效果图:
2、pull 创建 xml
pull方式,创建xml是通过 xmlserializer 类实现
首先,通过xmlserializer得到创建xml的实例 xmlserializer
接着,通过 xmlserializer 设置输出 xmlserializer.setoutput,xmlserializer.startdocument("utf-8", null)设置xml属性等
然后,通过 xmlserializer 创建 startdocument、starttag、text、endtag、enddocument等
/** pull方式,创建 xml */ public string pullxmlcreate(){ stringwriter xmlwriter = new stringwriter(); person []persons = new person[3]; // 创建节点person对象 persons[0] = new person(1, "sunboy_2050", "http://blogcsdnnet/sunboy_2050"); persons[1] = new person(2, "baidu", "http://wwwbaiducom"); persons[2] = new person(3, "google", "http://wwwgooglecom"); try { // // 方式一:使用android提供的实用工具类androidutilxml // xmlserializer xmlserializer = xmlnewserializer(); // 方式二:使用工厂类xmlpullparserfactory的方式 xmlpullparserfactory factory = xmlpullparserfactorynewinstance(); xmlserializer xmlserializer = factorynewserializer(); xmlserializersetoutput(xmlwriter); // 保存创建的xml xmlserializersetfeature("http://xmlpullorg/v1/doc/featureshtml#indent-output", true); // xmlserializersetproperty("http://xmlpullorg/v1/doc/propertieshtml#serializer-indentation", " "); // 设置属性 // xmlserializersetproperty("http://xmlpullorg/v1/doc/propertieshtml#serializer-line-separator", "\n"); xmlserializerstartdocument("utf-8", null); // <?xml version='0' encoding='utf-8' standalone='yes' ?> xmlserializerstarttag("", "root"); xmlserializerattribute("", "author", "homer"); xmlserializerattribute("", "date", "2012-04-28"); int personslen = personslength; for(int i=0; i<personslen; i++) { xmlserializerstarttag("", "person"); // 创建person节点 xmlserializerstarttag("", "id"); xmlserializertext(persons[i]getid()+""); xmlserializerendtag("", "id"); xmlserializerstarttag("", "name"); xmlserializertext(persons[i]getname()); xmlserializerendtag("", "name"); xmlserializerstarttag("", "blog"); xmlserializertext(persons[i]getblog()); xmlserializerendtag("", "blog"); xmlserializerendtag("", "person"); } xmlserializerendtag("", "root"); xmlserializerenddocument(); } catch (xmlpullparserexception e) { // xmlpullparserfactorynewinstance eprintstacktrace(); } catch (illegalargumentexception e) { // xmlserializersetoutput eprintstacktrace(); } catch (illegalstateexception e) { // xmlserializersetoutput eprintstacktrace(); } catch (ioexception e) { // xmlserializersetoutput eprintstacktrace(); } catch (exception e) { eprintstacktrace(); } savedxml(filename, xmlwritertostring()); return xmlwritertostring(); }
运行结果:
3、pull 解析 xml
pull方式,解析xml是通过 xmlpullparser 类实现
首先,通过xmlpullparser得到解析xml的实例 xpp
接着,通过 xpp设置输入 xpp.setinput(is, "utf-8"),声明定义保存xml信息的数据结构(如:person数组)
然后,通过 xpp 解析 start_document、start_tag、text、end_tag、end_document等
/** pull方式,解析 xml */ public string pullxmlresolve(){ stringwriter xmlwriter = new stringwriter(); inputstream is = readxml(filename); try { // // 方式一:使用android提供的实用工具类androidutilxml // xmlpullparser xpp = xmlnewpullparser(); // 方式二:使用工厂类xmlpullparserfactory的方式 xmlpullparserfactory factory = xmlpullparserfactorynewinstance(); xmlpullparser xpp = factorynewpullparser(); xppsetinput(is, "utf-8"); list<person> personslist = null; // 保存xml的person节点 person person = null; stringbuffer xmlheader = null; // 保存xml头部 string ele = null; // element flag int eventtype = xppgeteventtype(); while(xmlpullparserend_document != eventtype) { switch (eventtype) { case xmlpullparserstart_document: personslist = new arraylist<person>(); // 初始化persons xmlheader = new stringbuffer(); // 初始化xmlheader break; case xmlpullparserstart_tag: if("root"equals(xppgetname())) { string attrauthor = xppgetattributevalue(0); string attrdate = xppgetattributevalue(1); xmlheaderappend("root")append("\t\t"); xmlheaderappend(attrauthor)append("\t"); xmlheaderappend(attrdate)append("\n"); } else if("person"equals(xppgetname())) { person = new person(); // 创建person实例 } else if("id"equals(xppgetname())) { ele = "id"; } else if("name"equals(xppgetname())) { ele = "name"; } else if("blog"equals(xppgetname())) { ele = "blog"; } else { ele = null; } break; case xmlpullparsertext: if(null != ele) { if("id"equals(ele)) { personsetid(integerparseint(xppgettext())); } else if("name"equals(ele)) { personsetname(xppgettext()); } else if("blog"equals(ele)) { personsetblog(xppgettext()); } } break; case xmlpullparserend_tag: if("person"equals(xppgetname())){ personslistadd(person); person = null; } ele = null; break; } eventtype = xppnext(); // 下一个事件类型 } xmlwriterappend(xmlheader); int personslen = personslistsize(); for(int i=0; i<personslen; i++) { xmlwriterappend(personslistget(i)tostring()); } } catch (xmlpullparserexception e) { // xmlpullparserfactorynewinstance eprintstacktrace(); } catch (exception e) { eprintstacktrace(); } return xmlwritertostring(); }
运行结果:
4、person类
请参见前面博客 android 创建与解析xml(二)—— dom方式 【4、person类】
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android 创建与解析XML(四)——详解Pull方式
-
Android 创建与解析XML(五)——详解Dom4j方式
-
Android创建与解析XML(二)——详解Dom方式
-
Android编程解析XML方法详解(SAX,DOM与PULL)
-
Android编程解析XML方法详解(SAX,DOM与PULL)
-
详解Android之解析XML文件三种方式(DOM,PULL,SAX)
-
Android编程实现XML解析与保存的三种方法详解
-
Android中使用PULL方式解析XML文件深入介绍
-
详解Android之解析XML文件三种方式(DOM,PULL,SAX)
-
Android编程创建与解析xml的常用方法详解