李sir_Blog

博客园 首页 联系 订阅 管理

XML解析三种方式

DOM

通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;

简单直观,但需要将文档读取到内存,并不太适合移动设备;

SAX

SAX是一个解析速度快并且占用内存少的xml解析器;

采用事件驱动,它并不需要解析整个文档;

实现:继承DefaultHandler,覆写startElement、endElement、characters等方法;

PULL

Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型;推荐使用。

 

PULL解析XML核心代码

[java] view plaincopy
 
  1. XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();  
  2. parser.setInput(fileInputStream, “utf-8”);//设置数据源编码  
  3. int eventCode = parser.getEventType();//获取事件类型  
  4. while(eventCode != XmlPullParser.END_DOCUMENT)  {     
  5.     switch (eventCode){     
  6.         case XmlPullParser.START_DOCUMENT: //开始读取XML文档    
  7.         //实例化集合类    
  8.         break;     
  9.     case XmlPullParser.START_TAG://开始读取某个标签       
  10.         if("person".equals(parser.getName())) {     
  11.         //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值  
  12.         }     
  13.         break;  
  14.     case XmlPullParser.END_TAG://读完一个Person,可以将其添加到集合类中  
  15.         break;  
  16.     }  
  17.     parser.next();  
  18. }  

PULL解析XML示例方法

 
Java方法
[java] view plaincopy
 
  1. public static List<Person> readXML(InputStream inStream) {  
  2.     XmlPullParser parser = Xml.newPullParser();  
  3.     try {  
  4.         parser.setInput(inStream, "UTF-8");// 设置数据源编码  
  5.         int eventType = parser.getEventType();// 获取事件类型  
  6.         Person currentPerson = null;  
  7.         List<Person> persons = null;  
  8.         while (eventType != XmlPullParser.END_DOCUMENT) {  
  9.             switch (eventType) {  
  10.             case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理  
  11.                 persons = new ArrayList<Person>();// 实例化集合类  
  12.                 break;  
  13.             case XmlPullParser.START_TAG://开始读取某个标签  
  14.                 //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值  
  15.                 String name = parser.getName();  
  16.                 if (name.equalsIgnoreCase("person")) {  
  17.                     currentPerson = new Person();  
  18.                     currentPerson.setId(new Integer(parser.getAttributeValue(null"id")));  
  19.                 } else if (currentPerson != null) {  
  20.                     if (name.equalsIgnoreCase("name")) {  
  21.                         currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值  
  22.                     } else if (name.equalsIgnoreCase("age")) {  
  23.                         currentPerson.setAge(new Short(parser.nextText()));  
  24.                     }  
  25.                 }  
  26.                 break;  
  27.             case XmlPullParser.END_TAG:// 结束元素事件  
  28.                 //读完一个Person,可以将其添加到集合类中  
  29.                 if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {  
  30.                     persons.add(currentPerson);  
  31.                     currentPerson = null;  
  32.                 }  
  33.                 break;  
  34.             }  
  35.             eventType = parser.next();  
  36.         }  
  37.         inStream.close();  
  38.         return persons;  
  39.     } catch (Exception e) {  
  40.         e.printStackTrace();  
  41.     }  
  42.     return null;  
  43. }  

应用

XML文件
[html] view plaincopy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="23">  
  4.         <name>孙洋洋</name>  
  5.         <age>30</age>  
  6.     </person>  
  7.     <person id="20">  
  8.         <name>孙彬彬</name>  
  9.         <age>25</age>  
  10.     </person>  
  11. </persons>  
Activity文件
[java] view plaincopy
 
  1. package com.app.data;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileNotFoundException;  
  7. import java.io.FileOutputStream;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStreamWriter;  
  10. import java.net.HttpURLConnection;  
  11. import java.net.URL;  
  12. import java.util.ArrayList;  
  13. import java.util.HashMap;  
  14. import java.util.List;  
  15.   
  16. import org.xmlpull.v1.XmlPullParser;  
  17. import org.xmlpull.v1.XmlPullParserException;  
  18. import org.xmlpull.v1.XmlPullParserFactory;  
  19.   
  20. import com.app.other.Person;  
  21.   
  22. import android.app.Activity;  
  23. import android.os.Bundle;  
  24. import android.util.Xml;  
  25. import android.widget.TextView;  
  26.   
  27. public class XMLActivity extends Activity {  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         // TODO Auto-generated method stub  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_xml);  
  33.           
  34.         StringBuilder sBuilder = new StringBuilder();  
  35.         File xmlFile = new File("/mnt/sdcard/App/person.xml");  
  36.         try {  
  37.             FileInputStream inputStream = new FileInputStream(xmlFile);  
  38. //          URL url = new URL("http://10.0.2.2:8888/android/person.xml");  
  39. //          HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();  
  40. //          InputStream inputStream = urlConnection.getInputStream();  
  41.             List<Person> list = readXML(inputStream);  
  42.             for (int i = 0; i < list.size(); i++) {  
  43.                 Person person = list.get(i);  
  44.                 sBuilder.append("第-" + i + "-条记录:\n");  
  45.                 sBuilder.append("getName--" + person.getName() + "\n");  
  46.                 sBuilder.append("getAge--" + person.getAge() + "\n");  
  47.                 sBuilder.append("getId--" + person.getId() + "\n");  
  48.             }  
  49.             inputStream.close();  
  50.         } catch (Exception e) {  
  51.             // TODO Auto-generated catch block  
  52.             e.printStackTrace();  
  53.         }  
  54.         TextView textView = (TextView)findViewById(R.id.textView2);  
  55.         textView.setText(sBuilder);  
  56.     }  
  57.   
  58.     public static List<Person> readXML(InputStream inStream) {  
  59.         XmlPullParser parser = Xml.newPullParser();  
  60.         try {  
  61.             parser.setInput(inStream, "UTF-8");// 设置数据源编码  
  62.             int eventType = parser.getEventType();// 获取事件类型  
  63.             Person currentPerson = null;  
  64.             List<Person> persons = null;  
  65.             while (eventType != XmlPullParser.END_DOCUMENT) {  
  66.                 switch (eventType) {  
  67.                 case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理  
  68.                     persons = new ArrayList<Person>();// 实例化集合类  
  69.                     break;  
  70.                 case XmlPullParser.START_TAG://开始读取某个标签  
  71.                     //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值  
  72.                     String name = parser.getName();  
  73.                     if (name.equalsIgnoreCase("person")) {  
  74.                         currentPerson = new Person();  
  75.                         currentPerson.setId(new Integer(parser.getAttributeValue(null"id")));  
  76.                     } else if (currentPerson != null) {  
  77.                         if (name.equalsIgnoreCase("name")) {  
  78.                             currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值  
  79.                         } else if (name.equalsIgnoreCase("age")) {  
  80.                             currentPerson.setAge(new Short(parser.nextText()));  
  81.                         }  
  82.                     }  
  83.                     break;  
  84.                 case XmlPullParser.END_TAG:// 结束元素事件  
  85.                     //读完一个Person,可以将其添加到集合类中  
  86.                     if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {  
  87.                         persons.add(currentPerson);  
  88.                         currentPerson = null;  
  89.                     }  
  90.                     break;  
  91.                 }  
  92.                 eventType = parser.next();  
  93.             }  
  94.             inStream.close();  
  95.             return persons;  
  96.         } catch (Exception e) {  
  97.             e.printStackTrace();  
  98.         }  
  99.         return null;  
  100.     }  
  101. }  
XML布局文件
[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:padding="15dp" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="XML文件读取"  
  13.         android:layout_gravity="center_horizontal" />  
  14.   
  15.     <TextView  
  16.         android:id="@+id/textView2"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:text="TextView" />  
  20.   
  21. </LinearLayout>  
XML文件位置
 
 
 
执行结果:
 
 
posted on 2015-10-16 15:15  李sir  阅读(2266)  评论(0编辑  收藏  举报