android访问天气服务01--构建XmlPullParser

Pull模式解析原理:html

与SAX解析器模拟类似,也提供了相似的事件驱动.使用parser.next()能够进入下一个元素并触发相应事件。事件将做为数值代码被发送,所以可使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法能够获取下一个Text类型元素的值。java

Pull模式解析步骤:ide

一、 获得一个XmlPullParser对象这里获得XMLPullParser对象的方式有两种:工具

1)经过Xml这个工具类的.newPullParser()方式获得

   2)经过XmlPullParserFactory工厂建立

//获得XmlPullParserFacotry工厂 [java] view plaincopyprint?测试

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
  
XmlPullParser xmlparser = factory.newPullParser();

二、 再根据XmlPullParser对象设置输入流和编码格式 [java] view plaincopyprint?this

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

三、 而后循环遍历全部的结点能够经过文档开始的代码来判断读入到哪一个节点编码

关于xmlparser.getEventType()其值有:spa

Start_DOCUMENT:文档开始code

END_DOCUMENT:文档结束xml

START_TAG:开始读标签

END_TAG:标签结束

TEXT:所读的是文本内容

一个简单示例: [java] view plaincopyprint?

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: [html] view plaincopyprint?

<?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类: [java] view plaincopyprint?

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 [java] view plaincopyprint?

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

测试: [java] view plaincopyprint?

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);  
       }  
   
    }  
  
}
相关文章
相关标签/搜索