欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-27 18:34:39
 1、pull概述 android系统中和创建xml相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建xml的 xmlserializer,还...

 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 的效果图:
Android 创建与解析XML(四)——详解Pull方式

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(); 
  } 

运行结果:
Android 创建与解析XML(四)——详解Pull方式

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();     
  } 

运行结果:
Android 创建与解析XML(四)——详解Pull方式

4、person类

请参见前面博客 android 创建与解析xml(二)—— dom方式 【4、person类】

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