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 ...
随机推荐
- MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况
在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新:如果插入的行数 ...
- ios中键盘处理源码
1:先分别设置各个文本框的键盘类型(inputview)-->在特定键盘中textediting中禁用输入. 2:然后递归绑定各个键盘的工具条(inputaccessview).并且个各个控 ...
- 使用gprof对应用程序做性能评测
1,包含头文件gperftools/profiler.h 2,代码结构如下: int main() { // codes ProfilerStart("./profile"); / ...
- Tensorflow高级封装
Tensorflow比较灵活,但是它提供的操作比较低级,于是许多封装库应运而生. slim 导入方式 import tensorflow as tf import tensorflow.contrib ...
- Silverlight for Windows Phone开发系列课程
Silverlight for Windows Phone开发系列课程(1):Windows Phone平台概况 课程简介:本节开始介绍系列课程的概况,包括课程内容,先决条件,学习目的 ...
- Using PHP as a Spring MVC View via Quercus(转)
原贴: http://blog.caucho.com/2009/04/14/using-php-as-a-spring-mvc-view-via-quercus/ This week, I’ve be ...
- Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串
Jquery 选择器 详解 在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...
- PreparedStatement的用法及优点
jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力.在使用statem ...
- Http常见错误收集
HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...
- win8 应用商店程序使用SQLITE数据库
http://www.cnblogs.com/zhuzhenyu/archive/2012/11/27/2790193.html using SQLite; using System; using S ...