Android,XML解析
XML解析三种方式
DOM
通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;
简单直观,但需要将文档读取到内存,并不太适合移动设备;
SAX
SAX是一个解析速度快并且占用内存少的xml解析器;
采用事件驱动,它并不需要解析整个文档;
实现:继承DefaultHandler,覆写startElement、endElement、characters等方法;
PULL
Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型;推荐使用。
PULL解析XML核心代码
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setInput(fileInputStream, “utf-8”);//设置数据源编码
- int eventCode = parser.getEventType();//获取事件类型
- while(eventCode != XmlPullParser.END_DOCUMENT) {
- switch (eventCode){
- case XmlPullParser.START_DOCUMENT: //开始读取XML文档
- //实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- if("person".equals(parser.getName())) {
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- }
- break;
- case XmlPullParser.END_TAG://读完一个Person,可以将其添加到集合类中
- break;
- }
- parser.next();
- }
PULL解析XML示例方法
- public static List<Person> readXML(InputStream inStream) {
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(inStream, "UTF-8");// 设置数据源编码
- int eventType = parser.getEventType();// 获取事件类型
- Person currentPerson = null;
- List<Person> persons = null;
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
- persons = new ArrayList<Person>();// 实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- String name = parser.getName();
- if (name.equalsIgnoreCase("person")) {
- currentPerson = new Person();
- currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
- } else if (currentPerson != null) {
- if (name.equalsIgnoreCase("name")) {
- currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
- } else if (name.equalsIgnoreCase("age")) {
- currentPerson.setAge(new Short(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG:// 结束元素事件
- //读完一个Person,可以将其添加到集合类中
- if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
- persons.add(currentPerson);
- currentPerson = null;
- }
- break;
- }
- eventType = parser.next();
- }
- inStream.close();
- return persons;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
应用
- <?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>
Activity文件
- package com.app.data;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStreamWriter;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- import com.app.other.Person;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Xml;
- import android.widget.TextView;
- public class XMLActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_xml);
- StringBuilder sBuilder = new StringBuilder();
- File xmlFile = new File("/mnt/sdcard/App/person.xml");
- try {
- FileInputStream inputStream = new FileInputStream(xmlFile);
- // URL url = new URL("http://10.0.2.2:8888/android/person.xml");
- // HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
- // InputStream inputStream = urlConnection.getInputStream();
- List<Person> list = readXML(inputStream);
- for (int i = 0; i < list.size(); i++) {
- Person person = list.get(i);
- sBuilder.append("第-" + i + "-条记录:\n");
- sBuilder.append("getName--" + person.getName() + "\n");
- sBuilder.append("getAge--" + person.getAge() + "\n");
- sBuilder.append("getId--" + person.getId() + "\n");
- }
- inputStream.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- TextView textView = (TextView)findViewById(R.id.textView2);
- textView.setText(sBuilder);
- }
- public static List<Person> readXML(InputStream inStream) {
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(inStream, "UTF-8");// 设置数据源编码
- int eventType = parser.getEventType();// 获取事件类型
- Person currentPerson = null;
- List<Person> persons = null;
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
- persons = new ArrayList<Person>();// 实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- String name = parser.getName();
- if (name.equalsIgnoreCase("person")) {
- currentPerson = new Person();
- currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
- } else if (currentPerson != null) {
- if (name.equalsIgnoreCase("name")) {
- currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
- } else if (name.equalsIgnoreCase("age")) {
- currentPerson.setAge(new Short(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG:// 结束元素事件
- //读完一个Person,可以将其添加到集合类中
- if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
- persons.add(currentPerson);
- currentPerson = null;
- }
- break;
- }
- eventType = parser.next();
- }
- inStream.close();
- return persons;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
XML布局文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="15dp" >
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="XML文件读取"
- android:layout_gravity="center_horizontal" />
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView" />
- </LinearLayout>
XML文件位置


Android,XML解析的更多相关文章
- android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 三: 把复杂对象转换成 xml
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 二: 把对象转换成xml
前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...
- Android] Android XML解析学习——方式比较
[Android] Android XML解析学习——方式比较 (ZT) 分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...
- Android xml 解析
XML 经常使用的三种解析方式: DOM: 所有载入到内存,生成一个树状结构,占用内存比較大. SAJ: 採用事件驱动,速度快,效率高,不支持回退. PULL:也是採用事件驱动,语法简洁. 步骤: 1 ...
- Android XML解析器的问题
最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...
- android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件
简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...
- android XML解析器全解案例
1.使用pull解析 package com.example.myxml; import java.io.InputStream; import java.util.ArrayList; import ...
随机推荐
- Nginx自定义404页面
指定一个错误页面: error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } 指定一个url地址: ...
- [转载]TortoiseGit安装与使用
原文地址:TortoiseGit安装与使用作者:了凡春秋 之前一直用SVN做项目开发,确实感觉这些版本控制工具非常实用,尤其是在一个团队开发项目的时候.最近偶然看到一个新的版本管理工具Git,它本来是 ...
- 自动化安装smokeping-2.6.11脚本
自动化安装Smokeping-2.6.11脚本 一.目的 1.1 监控目的 为方便监测各数据中心网络状况,自定义全国各节点,从而发现网络异常,判断网络故障. 1.2 本文目的 快速部署Smokepin ...
- linux运维常见英文报错中文翻译(菜鸟必知)
linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permissio ...
- HDU 1556 Color the ball (数状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 【Servlet】使用org.eclipse.jetty实现小型的Servlet服务器
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...
- 【java】自定义异常类
目录结构: contents structure [+] 为什么需要自定义异常类 自定义异常的方式 实例 日常日志 一,为什么需要自定义异常类 当java中的异常类型没有能够满足我们所需的异常的时候就 ...
- tomcat服务器配置字符集为utf-8-彻底解决中文乱码问题
<Connector port="8070" protocol="HTTP/1.1" connectionTimeout="20000" ...
- PowerDsigner 16逆向工程导入mysql
由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYSQL的ODBC驱动 Connector/ODBC 5.1.1 ...
- PowerShell 获取Site Collection下被签出的文件
由于权限的设置,当文件被签出时导致别人不可见了,这对校验文件个数的人来说着实是件烦恼的事.幸好利用PowerShell,可以获取Site Collection下被签出的文件. Resolution A ...