Android開發進階(二)--XML文件解析之PULL模式解析

 

 Pull模式解析原理:

與SAX解析器模擬相似,也提供了類似的事件驅動.使用parser.next()可以進入下一個元素並觸發相應事件。事件將作爲數值代碼被髮送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值。

Pull模式解析步驟:

1、  得到一個XmlPullParser對象這裏得到XMLPullParser對象的方式有兩種:

       1)通過Xml這個工具類的.newPullParser()方式得到

       2)通過XmlPullParserFactory工廠創建

//得到XmlPullParserFacotry工廠

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlparser = factory.newPullParser();


2、  再根據XmlPullParser對象設置輸入流和編碼格式

parser.setInput(inputStream, "UTF-8");


3、  然後循環遍歷所有的結點可以通過文檔開始的代碼來判斷讀入到哪個節點

 

關於xmlparser.getEventType()其值有:

Start_DOCUMENT:文檔開始

END_DOCUMENT:文檔結束

START_TAG:開始讀標籤

END_TAG:標籤結束

TEXT:所讀的是文本內容

 

 

一個簡單示例:

 import java.io.IOException;
 import java.io.StringReader;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 public class SimpleXmlPullApp{
      public static void main (String args[])  throws XmlPullParserException, IOException{

         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
         XmlPullParser xpp = factory.newPullParser(); 

         xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );

         int eventType = xpp.getEventType();

         while (eventType != XmlPullParser.END_DOCUMENT) {

          if(eventType == XmlPullParser.START_DOCUMENT) {

              System.out.println("Start document");

          } else if(eventType == XmlPullParser.START_TAG) {

              System.out.println("Start tag "+xpp.getName());

          } else if(eventType == XmlPullParser.END_TAG) {

              System.out.println("End tag "+xpp.getName());

          } else if(eventType == XmlPullParser.TEXT) {

              System.out.println("Text "+xpp.getText());

          }
          eventType = xpp.next();
         }
         System.out.println("End document");
     }
 }

輸出結果:

Start document

Start tag foo

Text Hello World!

End tag foo

  還是以上一節的例子:讀取XML文件裏的內容把這些內容構造成一個Person對象,然後讀取這個XML文檔裏內容將其Person對象添加到一個List集合裏

person.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
       <person id="23">
              <name>李明</name>
              <age>30</age>
       </person>
       <person id="20">
              <name>李向梅</name>
              <age>25</age>
       </person>
</persons>

Person類:

public class Person {

    private Integer id;
    private String name;
    private short age;    
    public Integer getId() {
       return id;
    }
    public void setId(Integer id) {
       this.id = id;
    }
     public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
     public short getAge() {
       return age;
    }
    public void setAge(short age) {
       this.age = age;
    } 
    @Override
    public String toString() {
       return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
    }
}

業務bean

  public static List<Person> readXml(InputStream inputStream)

           throws Exception {

       List<Person> persons=null;

       // XMLPullParser對象

       XmlPullParser parser = Xml.newPullParser();

       //設置輸入流和編碼

       parser.setInput(inputStream, "UTF-8");

       // 文件開始代碼

       int eventCode = parser.getEventType();

       Person person = null;

       while (eventCode != XmlPullParser.END_DOCUMENT) {

           switch (eventCode) {

           //文檔開始

           case XmlPullParser.START_DOCUMENT:

              // 初始化

              persons = new ArrayList<Person>();

              break;

           case XmlPullParser.START_TAG: //開始標籤

              if ("person".equals(parser.getName())) {

                 person = new Person();

                 person.setId(Integer.parseInt(parser.getAttributeValue(0)));

              }

              else if(person!=null){

                  if ("name".equals(parser.getName())) {

                     //nextNext()如果下一個元素的內容是文本的時候適合用

                     person.setName(parser.nextText());

                  }
                  else if("age".equals(parser.getName())){
                     person.setAge(new Short(parser.nextText()));

                  }
              }
              break;
           case  XmlPullParser.END_TAG://結束標籤

              if ("person".equals(parser.getName()) && person!=null) {

                  persons.add(person);

                  person=null;//再擲爲null

              }

              break;     

           }
           // 下一個節點
           eventCode = parser.next();
       }
       return persons;
    }


 

 

測試:

public class SAXPersonServiceTest extends AndroidTestCase {

     private static final String TAG = "LogTest";

//PULL方式
    public void testPULLReadXml() throws Exception {

        System.out.println("testPULLReadXml");

       InputStream inputStream = SAXPersonServiceTest.class.getClassLoader()

              .getResourceAsStream("person.xml");

       List<Person> list = PULLPersonService.readXml(inputStream);

        System.out.println(list.size());
 
       for (Person person : list) {
           System.out.println(person);
       }
 
    }

}

如需轉載引用請註明出處:http://blog.csdn.net/jiahui524
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章