Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 創建與解析XML(四)——詳解Pull方式

Android 創建與解析XML(四)——詳解Pull方式

編輯:關於Android編程

 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類】

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved