android network develop(3)----Xml Parser

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: [email protected]

 *

 **********************************************************/
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: [email protected]

 *

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

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

时间: 2024-10-27 13:30:45

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

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

Check & Get network status Normally, there will be two type with phone network: wifi & mobile(gprs,3g,4fg) So, we have can test connect and get the connect type. 1.check connect: public static boolean isOnline(Context context) { ConnectivityManage

Android网络下解析XML

XML(Extensible Markup Language)可拓展标记语言,它与HTML一样,都是SGML(标准通用标记语言),它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.在Android下有三种方式解析XML,分别为SAX.DOM.PULL:它们有各自的特点,在网络编程中会经常使用,根据实际情况选择哪一种解析方式. 1.内存占用 由于Android手机性能相对于PC还是

Android 5.0 system_fonts.xml文件的解析过程

Android 5.0 system_fonts.xml文件的解析过程 首先看看看5.0 中familyset version="22" 的格式 20 <family name="sans-serif"> 21 <font weight="100" style="normal">Roboto-Thin.ttf</font> 22 <font weight="100"

android 通过pull解析xml文件

1 package com.example.xmldemo.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 import java.

Android中用PULL解析XML

解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大,内存较小的场景.DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树.检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息.由于DOM在内存中以树形结构存放,因此检索和更新效率会更高.但是对于特别大的文档,解析和加载整个文档将

Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器.解析器.转换器 API,对 XML 进行解析和转换. XML,相关有DOM.SAX.JDOM.DOM4J.Xerces.JAXP等一堆概念,但是很多人总是会弄混他们之间的关系,这对我们理解XML文件的创建和解析很不利.要挑选一个适合在Android平台上使用的XML解析方案,我们还是得先把这些概念厘清. XML基本概念 DOM(Document Object Model,文档对象模

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

Android自定义属性:attr.xml 与 TypedArray

1.attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="textColor" format="color" /> <attr name="textSize" format=&q

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

这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并没有发现什么问题,在logcat上显示的报错如下:AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class(这是其中报错的最主要的一行信息).  于是我在百度上几乎查看