当前位置: 首页 > 编程笔记 >

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

丌官玺
2023-03-14
本文向大家介绍Android 创建与解析XML(四)——详解Pull方式,包括了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(); 
       
      // 方式二:使用html" target="_blank">工厂类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 pull解析xml的实现方法,包括了Android pull解析xml的实现方法的使用技巧和注意事项,需要的朋友参考一下 Android pull解析xml的实现方法 资源文件: persons.xml activity布局文件 activity_main.xml javaBean: 主activity: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大

  • 本文向大家介绍详解Java解析XML的四种方法,包括了详解Java解析XML的四种方法的使用技巧和注意事项,需要的朋友参考一下 XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document

  • 本文向大家介绍Android编程使用pull方式解析xml格式文件的方法详解,包括了Android编程使用pull方式解析xml格式文件的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程使用pull方式解析xml格式文件的方法。分享给大家供大家参考,具体如下: 上次已经说过使用Android sax解析xml,实际上还可以使用pull解析xml.这样的方式效率也是

  • 本文向大家介绍Android解析XML的三种方式SAX、Pull、Dom,包括了Android解析XML的三种方式SAX、Pull、Dom的使用技巧和注意事项,需要的朋友参考一下 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),本文对androi

  • 本文向大家介绍Android解析XML(PULL)展示到ListView,包括了Android解析XML(PULL)展示到ListView的使用技巧和注意事项,需要的朋友参考一下 Android解析XML展示到ListView运行后的效果图如下: 服务端的请求页面 服务端返回结果的页面 服务端的Java代码 服务端的配置文件(struts.xml) 服务端的运行结果 Android (布局文件 a

  • 本文向大家介绍详解Android中解析XML的方法,包括了详解Android中解析XML的方法的使用技巧和注意事项,需要的朋友参考一下 XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。 在Android中,常见的XML解析器分别为S