android解析xml比较麻烦,针对每个xml文件,需要有专门的xml解析类。
现对pull进行了简单的封装,不用再给每个xml创建解析类,可以直接解析xml,主要通过反射实现的。
能解析的xml形式主要有如下几种,其他复杂格式暂未支持。
能解析的xml形式主要有如下几种,其他复杂格式暂未支持。
1、支持简单的列表解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<user id="1">
<userName>张三</userName>
<email>zhangsan@xxx.com</email>
</user>
<user>
<id>2</id>
<userName>李四</userName>
<email>lisi@xxx.com</email>
</user>
<user>
<id>3</id>
<userName>王五</userName>
<email>wangwu@xxx.com</email>
</user>
</list>
对应的Java类如下:
package com.juziku.demo.xml;
public class User {
private int id;
private String userName;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2、支持简单的对象解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<id>1</id>
<code>1002</code>
<name>测试</name>
</menu>
或
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<menu id="1" code="1002">
<name>测试</name>
</menu>
对应的Java类如下:
package com.juziku.demo.xml;
public class Menu {
private int id;
private int code;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、支持对象中包含List列表的解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<total>33</total>
<list>
<user>
<id>1</id>
<userName>张三</userName>
<email>zhangsan@xxx.com</email>
</user>
<user id="2">
<userName>李四</userName>
<email>lisi@xxx.com</email>
</user>
<user id="3" userName="王五">
<email>wangwu@xxx.com</email>
</user>
</list>
</parent>
对应的Java类如下:
package com.juziku.demo.xml;
import java.util.List;
public class UserList {
private int total;
private List<User> user;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
解析xml的代码如下所示:
package com.juziku.demo.xml;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Log;
import android.util.Xml;
/**
* 对pull解析xml进行了封装,不用给每个xml,再创建一个解析类
*
* @author steven
*
* http://www.juziku.com/sunlightcs/
*
*/
public class XmlParse {
/**
* 解析XML
* @param is xml字节流
* @param clazz 字节码 如:Object.class
* @param startName 开始位置
* @return 返回List列表
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public List getXmlList(InputStream is, Class<?> clazz, String startName) {
List list = null;
XmlPullParser parser = Xml.newPullParser();
Object object = null;
try {
parser.setInput(is, "UTF-8");
//事件类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Object>();
break;
case XmlPullParser.START_TAG:
//获得当前节点元素的名称
String name = parser.getName();
if (startName.equals(name)) {
object = clazz.newInstance();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int i=0; i<count; i++)
setXmlValue(object, parser.getAttributeName(i), parser.getAttributeValue(i));
} else if (object != null) {
setXmlValue(object, name, parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (startName.equals(parser.getName())) {
list.add(object);
object = null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("xml pull error", e.toString());
}
return list;
}
/**
* 解析XML
* @param is xml字节流
* @param clazz 字节码 如:Object.class
* @return 返回Object
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object getXmlObject(InputStream is, Class<?> clazz) {
XmlPullParser parser = Xml.newPullParser();
Object object = null;
List list = null;
Object subObject = null;
String subName = null;
try {
parser.setInput(is, "UTF-8");
//事件类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
object = clazz.newInstance();
break;
case XmlPullParser.START_TAG:
//获得当前节点元素的名称
String name = parser.getName();
Field[] f = null;
if(subObject == null){
f = object.getClass().getDeclaredFields();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int j=0; j<count; j++)
setXmlValue(object, parser.getAttributeName(j), parser.getAttributeValue(j));
}else{
f = subObject.getClass().getDeclaredFields();
}
for(int i = 0; i < f.length; i++){
if(f[i].getName().equalsIgnoreCase(name)){
//判断是不是List类型
if(f[i].getType().getName().equals("java.util.List")){
Type type = f[i].getGenericType();
if (type instanceof ParameterizedType) {
//获得泛型参数的实际类型
Class<?> subClazz = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0];
subObject = subClazz.newInstance();
subName = f[i].getName();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int j=0; j<count; j++)
setXmlValue(subObject, parser.getAttributeName(j), parser.getAttributeValue(j));
if(list == null){
list = new ArrayList<Object>();
f[i].setAccessible(true);
f[i].set(object, list);
}
}
}else{ //普通属性
if(subObject != null){
setXmlValue(subObject, name, parser.nextText());
}else{
setXmlValue(object, name, parser.nextText());
}
}
break;
}
}
break;
case XmlPullParser.END_TAG:
if (subObject != null && subName.equalsIgnoreCase(parser.getName())) {
list.add(subObject);
subObject = null;
subName = null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("xml pull error", e.getMessage());
}
return object;
}
/**
* 把xml标签的值,转换成对象里属性的值
* @param t 对象
* @param name xml标签名
* @param value xml标签名对应的值
*/
private void setXmlValue(Object t, String name, String value){
try {
Field[] f = t.getClass().getDeclaredFields();
for(int i = 0; i < f.length; i++){
if(f[i].getName().equalsIgnoreCase(name)){
f[i].setAccessible(true);
//获得属性类型
Class<?> fieldType = f[i].getType();
if(fieldType == String.class) {
f[i].set(t, value);
}else if(fieldType == Integer.TYPE) {
f[i].set(t, Integer.parseInt(value));
}else if(fieldType == Float.TYPE) {
f[i].set(t, Float.parseFloat(value));
}else if(fieldType == Double.TYPE) {
f[i].set(t, Double.parseDouble(value));
}else if(fieldType == Long.TYPE) {
f[i].set(t, Long.parseLong(value));
}else if(fieldType == Short.TYPE) {
f[i].set(t, Short.parseShort(value));
}else if(fieldType == Boolean.TYPE) {
f[i].set(t, Boolean.parseBoolean(value));
}else{
f[i].set(t, value);
}
}
}
} catch (Exception e) {
Log.e("xml error", e.toString());
}
}
}
现对pull进行了简单的封装,不用再给每个xml创建解析类,可以直接解析xml,主要通过反射实现的。
能解析的xml形式主要有如下几种,其他复杂格式暂未支持。
能解析的xml形式主要有如下几种,其他复杂格式暂未支持。
1、支持简单的列表解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<user id="1">
<userName>张三</userName>
<email>zhangsan@xxx.com</email>
</user>
<user>
<id>2</id>
<userName>李四</userName>
<email>lisi@xxx.com</email>
</user>
<user>
<id>3</id>
<userName>王五</userName>
<email>wangwu@xxx.com</email>
</user>
</list>
对应的Java类如下:
package com.juziku.demo.xml;
public class User {
private int id;
private String userName;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2、支持简单的对象解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<id>1</id>
<code>1002</code>
<name>测试</name>
</menu>
或
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<menu id="1" code="1002">
<name>测试</name>
</menu>
对应的Java类如下:
package com.juziku.demo.xml;
public class Menu {
private int id;
private int code;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、支持对象中包含List列表的解析,如:
<?xml version="1.0" encoding="UTF-8"?>
<parent>
<total>33</total>
<list>
<user>
<id>1</id>
<userName>张三</userName>
<email>zhangsan@xxx.com</email>
</user>
<user id="2">
<userName>李四</userName>
<email>lisi@xxx.com</email>
</user>
<user id="3" userName="王五">
<email>wangwu@xxx.com</email>
</user>
</list>
</parent>
对应的Java类如下:
package com.juziku.demo.xml;
import java.util.List;
public class UserList {
private int total;
private List<User> user;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
解析xml的代码如下所示:
package com.juziku.demo.xml;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Log;
import android.util.Xml;
/**
* 对pull解析xml进行了封装,不用给每个xml,再创建一个解析类
*
* @author steven
*
* http://www.juziku.com/sunlightcs/
*
*/
public class XmlParse {
/**
* 解析XML
* @param is xml字节流
* @param clazz 字节码 如:Object.class
* @param startName 开始位置
* @return 返回List列表
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public List getXmlList(InputStream is, Class<?> clazz, String startName) {
List list = null;
XmlPullParser parser = Xml.newPullParser();
Object object = null;
try {
parser.setInput(is, "UTF-8");
//事件类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Object>();
break;
case XmlPullParser.START_TAG:
//获得当前节点元素的名称
String name = parser.getName();
if (startName.equals(name)) {
object = clazz.newInstance();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int i=0; i<count; i++)
setXmlValue(object, parser.getAttributeName(i), parser.getAttributeValue(i));
} else if (object != null) {
setXmlValue(object, name, parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (startName.equals(parser.getName())) {
list.add(object);
object = null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("xml pull error", e.toString());
}
return list;
}
/**
* 解析XML
* @param is xml字节流
* @param clazz 字节码 如:Object.class
* @return 返回Object
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object getXmlObject(InputStream is, Class<?> clazz) {
XmlPullParser parser = Xml.newPullParser();
Object object = null;
List list = null;
Object subObject = null;
String subName = null;
try {
parser.setInput(is, "UTF-8");
//事件类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
object = clazz.newInstance();
break;
case XmlPullParser.START_TAG:
//获得当前节点元素的名称
String name = parser.getName();
Field[] f = null;
if(subObject == null){
f = object.getClass().getDeclaredFields();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int j=0; j<count; j++)
setXmlValue(object, parser.getAttributeName(j), parser.getAttributeValue(j));
}else{
f = subObject.getClass().getDeclaredFields();
}
for(int i = 0; i < f.length; i++){
if(f[i].getName().equalsIgnoreCase(name)){
//判断是不是List类型
if(f[i].getType().getName().equals("java.util.List")){
Type type = f[i].getGenericType();
if (type instanceof ParameterizedType) {
//获得泛型参数的实际类型
Class<?> subClazz = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0];
subObject = subClazz.newInstance();
subName = f[i].getName();
//判断标签里是否有属性,如果有,则全部解析出来
int count = parser.getAttributeCount();
for(int j=0; j<count; j++)
setXmlValue(subObject, parser.getAttributeName(j), parser.getAttributeValue(j));
if(list == null){
list = new ArrayList<Object>();
f[i].setAccessible(true);
f[i].set(object, list);
}
}
}else{ //普通属性
if(subObject != null){
setXmlValue(subObject, name, parser.nextText());
}else{
setXmlValue(object, name, parser.nextText());
}
}
break;
}
}
break;
case XmlPullParser.END_TAG:
if (subObject != null && subName.equalsIgnoreCase(parser.getName())) {
list.add(subObject);
subObject = null;
subName = null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e("xml pull error", e.getMessage());
}
return object;
}
/**
* 把xml标签的值,转换成对象里属性的值
* @param t 对象
* @param name xml标签名
* @param value xml标签名对应的值
*/
private void setXmlValue(Object t, String name, String value){
try {
Field[] f = t.getClass().getDeclaredFields();
for(int i = 0; i < f.length; i++){
if(f[i].getName().equalsIgnoreCase(name)){
f[i].setAccessible(true);
//获得属性类型
Class<?> fieldType = f[i].getType();
if(fieldType == String.class) {
f[i].set(t, value);
}else if(fieldType == Integer.TYPE) {
f[i].set(t, Integer.parseInt(value));
}else if(fieldType == Float.TYPE) {
f[i].set(t, Float.parseFloat(value));
}else if(fieldType == Double.TYPE) {
f[i].set(t, Double.parseDouble(value));
}else if(fieldType == Long.TYPE) {
f[i].set(t, Long.parseLong(value));
}else if(fieldType == Short.TYPE) {
f[i].set(t, Short.parseShort(value));
}else if(fieldType == Boolean.TYPE) {
f[i].set(t, Boolean.parseBoolean(value));
}else{
f[i].set(t, value);
}
}
}
} catch (Exception e) {
Log.e("xml error", e.toString());
}
}
}
相关推荐
Android 封装pull解析xml,可直接调用
android xml pull解析示例,自己mark下,备忘
解析XML文件:在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过...
一些工具类代码块的标准代码,包括: xml 转换List列表 转换Object 把xml标签的值,转换成对象里属性的值
dom4j 目录的介绍: 1)docs 是文档目录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 2)lib 目录 ...第三方的解析: jdom 在 dom 基础上进行了封装、 dom4j 又对 jdom 进行了封装。 pull 主要用在 And
libxml是对著名libxml XML解析器C封装版本 C各大有名库介绍——科学计算 1、Blitz 参考网站WebSite:http://www.oonumerics.org/blitz Blitz 是个高效率数值计算库它设计目是希望建立套既具像C 样方便同时又比...
进行解析。 使用 pathvariable 和 requestparam 传递参数,使用 velocity 编写页面模板,注意其中的语法使用。常用 $!{} 和 ${}。 使用 HTTP 规范下的 httpservletrequest 和 httpservletresponse 来封装请求和相...
|--xml文件的pull解析与序列化写入 |--xml的封装序列化 |--任务循环之只在Activity显示时执行 |--修改文件的最后修改时间 |--偏好设置(回显) |--内存优化之各种方法 |--内容提供者之短信的序列化对象读写 |--内容...
� 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发 既 有用又有吸引力的移动...