Normally, there are three type parser in android. Xmlpullparser, DOM & SAX.

Google recomand Xmlpullparser to doing this.

But to parser xml files or inputstream, it based on xml content.

So using an general way to parser xml.

BaseXmlObj:

/***********************************************************

 *@description : This class function is TODO 

 *

 * @create author : deman.lu

 * @create date   :2015-07-15

 * @modify author :

 * @modify date   :

 * @contact: joyfulmath.china@gmail.com

 *

 **********************************************************/
package com.joyfulmath.androidstudy.connect.xmlparser; import java.lang.reflect.Field; public abstract class BaseXmlObj {
public abstract String[] getNodes(); public void setParamater(String tag, Object value) { try { Field field = getClass().getField(tag); field.setAccessible(true); field.set(this, value); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }
}
/***********************************************************

 *@description : This class function is TODO 

 *

 * @create author : deman.lu

 * @create date   :2015-07-15

 * @modify author :

 * @modify date   :

 * @contact: joyfulmath.china@gmail.com

 *

 **********************************************************/

package com.joyfulmath.androidstudy.connect.xmlparser;

import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import android.content.res.XmlResourceParser; public class XmlParserUtils { private static String encode = "utf-8";
public static XmlPullParser pullParser;
static { try {
pullParser = XmlPullParserFactory.newInstance().newPullParser();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
} /**
*
* @description :解析节点中的内容,封装成对象模型。
*
* @author : deman.lu
*
* @create :2015-07-15
*
* @param in network data contains xml
*
* @param obj
*
* @throws Exception
*
* @return :T extends BaseXmlObj
*/
public static <T extends BaseXmlObj> void streamText2Model(InputStream in,
T obj) throws Exception { pullParser.setInput(in, encode);
int eventType = pullParser.getEventType();
String[] nodes = obj.getNodes();
String nodeName = null;
boolean success = true; while (eventType != XmlPullParser.END_DOCUMENT && success) { switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break; case XmlPullParser.START_TAG:
nodeName = pullParser.getName();
break; case XmlPullParser.TEXT:
for (int i = 0; i < nodes.length; i++) {
if (nodes[i].equals(nodeName)) {
obj.setParamater(nodeName, pullParser.getText());
}
}
break; case XmlPullParser.END_TAG:
break;
} eventType = pullParser.next();
}
} /**
*
* @description :解析节点中的内容,封装成对象模型。
*
* @author : deman.lu
*
* @create :2015-07-15
*
* @param resParser XmlResourceParser read form resource
*
* @param obj
*
* @throws Exception
*
* @return :void
*/
public static <T extends BaseXmlObj> void streamText2Model(XmlResourceParser resParser,
T obj) throws Exception { int eventType = resParser.getEventType();
String[] nodes = obj.getNodes();
String nodeName = null;
boolean success = true; while (eventType != XmlPullParser.END_DOCUMENT && success) { switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break; case XmlPullParser.START_TAG:
nodeName = resParser.getName();
break; case XmlPullParser.TEXT:
for (int i = 0; i < nodes.length; i++) {
if (nodes[i].equals(nodeName)) {
obj.setParamater(nodeName, resParser.getText());
}
}
break; case XmlPullParser.END_TAG:
break;
} eventType = resParser.next();
}
} }

we using reflect, but if xml is complex, the efficiency may be low.

The way should be decided.

package com.joyfulmath.androidstudy.connect;

import java.io.Serializable;

import com.joyfulmath.androidstudy.connect.xmlparser.BaseXmlObj;

public class Student extends BaseXmlObj implements Serializable {

    /**
*
*/
private static final long serialVersionUID = 1L; public String GradeID, GradeName, ClassID, ClassName, UserID, UserName; public Student() {
} @Override
public String[] getNodes() {
return new String[] { "GradeID", "GradeName", "ClassID", "ClassName", "UserID", "UserName" };
} @Override
public String toString() {
String su = "@student:"+"GradeID:"+GradeID
+"GradeName:"+GradeName
+"ClassID:"+ClassID
+"ClassName:"+ClassName
+"UserID:"+UserID
+"UserName:"+UserName;
return NetWorkUtils.replaceBlank(su);
} }
package com.joyfulmath.androidstudy.connect;

import com.joyfulmath.androidstudy.connect.xmlparser.XmlParserUtils;

import android.content.Context;
import android.content.res.XmlResourceParser; public class XmlParserDemo { public static Student parserStudentXml(Context context,int resId)
{
try {
Student student = new Student();
XmlResourceParser xml = context.getResources()
.getXml(resId);
XmlParserUtils.streamText2Model(xml, student);
xml.close();
return student;
} catch (Exception e) {
e.printStackTrace();
} return null; }
}
<?xml version="1.0" encoding="UTF-8"?>
<DsXml> <IsLog>
true </IsLog> <GradeID>
10001 </GradeID> <GradeName>
高一年级 </GradeName> <ClassID>
10010 </ClassID> <ClassName>
高一(01)班 </ClassName> <UserID>
10000 </UserID> <UserName>
张三 </UserName> </DsXml>

转载:http://www.cnblogs.com/vanezkw/archive/2013/03/03/2941496.html

android network develop(3)----Xml Parser的更多相关文章

  1. android network develop(1)----doing network background

    Develop network with HttpURLConnection & HttpClient. HttpURLConnection  is lightweight with Http ...

  2. android network develop(2)----network status check

    Check & Get network status Normally, there will be two type with phone network: wifi & mobil ...

  3. Android中用PULL解析XML

    解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...

  4. (转载)XML Tutorial for iOS: How To Choose The Best XML Parser for Your iPhone Project

    There are a lot of options when it comes to parsing XML on the iPhone. The iPhone SDK comes with two ...

  5. Android 数据存储(XML解析)

      在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据 ...

  6. Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

    这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并 ...

  7. bug_ _ android.view.InflateException: Binary XML file line #2: Error inflating class <unknown

    ========= 5.0     android异常“android.view.InflateException: Binary XML file line # : Error inflating ...

  8. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  9. 【转】android颜色对应的xml配置值

    原文网址:http://www.cnblogs.com/etgyd/archive/2011/04/02/2003778.html android颜色对应的xml配置值 <?xml versio ...

随机推荐

  1. [pyhton]python内建方法

    撸一遍python的内建方法 这样做的好处就是:我如果要完成一个功能的时候,如果能用内建方法完成,就用内建方法.这样可以提高效率,同时使自己的代码更加优雅.哎呦?那岂不是撸完就是python高手了?我 ...

  2. 数据库收缩:NOTRUNCATE与TRUNCATEONLY

    在进行数据库收缩时,我们有2个可用选项:NOTRUNCATE,TRUNCATEONLY.这篇文章我们会详细讨论下这2个选项的具体区别. NOTRUNCATE 当你对数据库收缩命令提供NOTRUNCAT ...

  3. sitemesh学习笔记(2)

    之前我也是通过网上一些资料来学习sitemesh的,后来发现那些资料都比较老了,现在最近的已经是sitemesh3了而我之前看的是sitemesh2.3,今天重新去看了一些sitemesh3的资料,发 ...

  4. QCustomplot使用分享(三) 图

    一.可以实现的图 相对于其他绘制图表的第三方库来说,QCustomPlot算是比较轻量的,不仅仅能实现功能,而且二次开发比较容易.下面我们来具体说下他可以实现那些图 QCPGraph:折线图,Line ...

  5. .Net反射机制分析和使用

    1..NET反射的概述 .NET反射是审查元数据并动态收集关于它的类型信息的能力. 应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域.这些域在拥有相同应 ...

  6. 控制网页的Panel是否显示

    在网页上有十二个Panel控件,默认状态是不显示的,根据当前月作为条件去控制对应的Panel控件显示. Insus.NET以下使用三种方法来实现它,先是第一种,使用FindControl方法 第二种方 ...

  7. margin的使用方法与技巧

    1.margin还可以用来做平移,作用类似translate哈哈.将元素设成absolute后就可以用margin随便平移他了,既不像relative那样要霸占空间,又不用为父元素设置relative ...

  8. 重新想象 Windows 8 Store Apps (63) - 通信: WebSocket

    [源码下载] 重新想象 Windows 8 Store Apps (63) - 通信: WebSocket 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通信 So ...

  9. scons学习

    http://blog.csdn.net/andyelvis/article/category/948141 http://www.scons.org/doc/production/HTML/scon ...

  10. Genymotion Shell命令

    命令行选项 •-h 输出帮助信息 •-r ip_address 连接到特定Genymotion虚拟设备 •-c "command" 在原生shell环境中执行给定命令而后返回 •- ...