当前位置: 移动技术网 > IT编程>移动开发>Android > Android 创建与解析XML(四)——详解Pull方式

Android 创建与解析XML(四)——详解Pull方式

2019年07月24日  | 移动技术网IT编程  | 我要评论

共腾网,冒险奇兵2008,重庆市委书记是谁

 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://www.lhsxpumps.com/_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类】

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网