zoukankan      html  css  js  c++  java
  • Android,XML解析

    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 + "-条记录: ");  
    45.                 sBuilder.append("getName--" + person.getName() + " ");  
    46.                 sBuilder.append("getAge--" + person.getAge() + " ");  
    47.                 sBuilder.append("getId--" + person.getId() + " ");  
    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文件位置
     
     
     
    执行结果:
     
     
  • 相关阅读:
    Es spring data jpa 修改连接配置
    object转map类型
    记一次项目中yaml文档引发的惨案 (#yaml文档格式#yaml中'-'的作用)
    02-方法重载
    01-数据类型分类
    Centos 7 Sublime 安装 package control
    修改AdminLTE左侧菜单展开延迟
    【Flask】Flask Restful api
    【Flask】Flask常用信号
    【Flask】Flask上下文
  • 原文地址:https://www.cnblogs.com/lzjsky/p/4885355.html
Copyright © 2011-2022 走看看