亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android通用xml解析方法

2020-04-11 12:30:52
字體:
來源:轉載
供稿:網友

1、為什么需要寫一個通用xml解析方法。

當需要解析不同的xml節點。你有可能是在xml解析的時候匹配不同節點并且節點名都是寫死的,這樣的話你解析不同的節點就需要不同的解析方法。當然這種方式是最簡單也是最笨的方法。為了減少代碼把代碼寫得更有質量那么你就需要考慮設計一個通用的xml解析方法。

2、解析思路。

一般情況下,xml的解析結果最好放在一個實體類對象中,那樣的話你使用起來非常方便(當然也更OO了),你也可以選擇其他的方法把解析結果保存下來,不過個人覺得這種方式是比較好的。在解析過程中你需要做的是什么呢?這是解析的關鍵。其實就是把要解析的結果設置給對象的屬性(成員變量),考慮到這點,那么肯定是需要知道對象有哪些屬性啊,那就給實體類加一個方法(其實這里是做一定的規范)用于獲得屬性。知道了屬性名以后下一步當然就是設置這些屬性的值。因為不同的實體類的屬性不同,所以設置值采用反射機制。大體上的思路就是這個樣子。具體代碼后面講。

3、解析xml的格式類型。

文字只寫兩種xml格式的解析。其他格式你可以參考本文的思路任意發揮。

①只有節點中內容:如

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8" ?>

<Result>

  <StuId>30323</StuId>

  <ClassID>10042</ClassID>

</Result>


②只有節點屬性:如

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8" ?>

<Result>

   <ProjLst Name="測試1" Id="1" />

   <ProjLst Name="測試2" Id="2" />

   <ProjLst Name="測試3" Id="3" />

</Result>


4、如何實現。

①根據設計思路,你需要一個實體類,但是實體類有一定的規范(為了解析)。所以這些規范還需要實現一些統一的方法,于是就有了一個抽象類:BaseObj。

復制代碼 代碼如下:

BaseObj

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

 *@description : This class function is TODO

 *

 * @create author : kwzhang

 * @create date   :2013-2-28

 * @modify author :

 * @modify date   :

 * @contact: vanezkw@163.com

 *

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

package com.vane.elearning.model;

 

import java.lang.reflect.Field;

 

/**

 * @author kwzhang

 *

 */

public abstract class BaseObj {

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();

}

}

}


②根據具體的節點類型生成類的成員。這里先看看需要解析的xml。

復制代碼 代碼如下:

<?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>


③對應的實體類。

復制代碼 代碼如下:

View Code

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

 *@description : This class function is TODO

 *

 * @create author : kwzhang

 * @create date   :2013-2-28

 * @modify author :

 * @modify date   :

 * @contact: vanezkw@163.com

 *

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

package com.vane.elearning.model;

import java.io.Serializable;

/**

 * @author kwzhang

 *

 */

public class Student extends BaseObj 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" };

}

}


實體類中的是這樣規范的:getNodes()返回的是xml的節點名,命名必須相同,并且成員變量名必須和節點名相同。當然這里實現Serializable 接口只是我自己的項目中的需求而已,和本文無關。

④最關鍵是如何解析。

復制代碼 代碼如下:

View Code

/**

 * @description :解析節點中的內容,封裝成對象模型。

 * @author : kwzhang

 * @create :2013-2-28

 * @param in

 * @param obj

 * @throws Exception

 * @return :void

 */

public static <T extends BaseObj> 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:

if ("IsLog".equals(nodeName) && pullParser.getText().equals("false")) {

success = false;

break;

}

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();

}

}


當然里面的一些變量在類初始化的時候就完成了。如下:

復制代碼 代碼如下:

private static String encode = "utf-8";

public static XmlPullParser pullParser;

static {

try {

  pullParser = XmlPullParserFactory.newInstance().newPullParser();

  } catch (XmlPullParserException e) {

  e.printStackTrace();

}

}


⑤如何使用.如下:

復制代碼 代碼如下:

XmlUtils.streamText2Model(result, ActMain.student);

很簡單吧。result就是xml的數據流。具體的細節可以自己體會一下。這個解析類在一定程度上可以通用,也就是你的xml格式符合“只有節點中內容”那么就可以這么通用。為了方便下文做說明暫且把這種類型的xml稱為“類型A”。

⑥說說另一種格式“只有節點屬性”如何“通用”解析。為了方便下文做說明暫且把這種類型的xml稱為“類型B”。下文所講的都是針對類型B的相關代碼。類型B的xml如下:

復制代碼 代碼如下:

View Code

 <?xml version="1.0" encoding="UTF-8" ?>

  <DsXml>

  <ProjLst KeliName="測試1" KeliId="170" SubId="13" ExeTp="1" ExeType="預習" ExeDt="2013-2-27" ExeCount="4" SubName="信息技術" />

  <ProjLst KeliName="測試2" KeliId="154" SubId="13" ExeTp="1" ExeType="預習" ExeDt="2012-11-19" ExeCount="2" SubName="信息技術" />

  <ProjLst KeliName="測試2" KeliId="150" SubId="13" ExeTp="3" ExeType="課后" ExeDt="2012-11-15" ExeCount="2" SubName="信息技術" />

  </DsXml>


⑦類型B實體類如下:(其實和類型A是一樣的)

復制代碼 代碼如下:

View Code

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

 *@description : This class function is TODO

 *

 * @create author : kwzhang

 * @create date   :2013-2-28

 * @modify author :

 * @modify date   :

 * @contact: vanezkw@163.com

 *

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

package com.vane.elearning.model;

import java.io.Serializable;

/**

 * @author kwzhang

 *

 */

public class Keli extends BaseObj implements Serializable {

private static final long serialVersionUID = 1L;

public String KeliName, KeliId, SubId, ExeTp, ExeType, ExeDt, ExeCount, SubName;

public Keli() {

}

@Override

public String[] getNodes() {

return new String[] { "KeliName", "KeliId", "SubId", "ExeTp", "ExeType", "ExeDt", "ExeCount", "SubName" };

}

}


⑧類型B解析方法如下:

復制代碼 代碼如下:

View Code

/**

 * @description : 解析xml中的屬性,封裝成對象模型。

 * @author : kwzhang

 * @create :2013-2-28

 * @param in

 * @param obj

 * @throws Exception

 * @return :void

 */

public static <T extends BaseObj> List<T> streamParam2Model(InputStream in, T obj) throws Exception {

pullParser.setInput(in, encode);

int eventType = pullParser.getEventType();

ArrayList<T> list = new ArrayList<T>(4);

String[] nodes = obj.getNodes();

while (eventType != XmlPullParser.END_DOCUMENT) {

switch (eventType) {

case XmlPullParser.START_DOCUMENT:

break;

case XmlPullParser.START_TAG:

String name = pullParser.getName();

boolean flag = false;

if (null == name || name.equals("")) {

break;

}

for (int i = 0; i < nodes.length; i++) {

String value = pullParser.getAttributeValue(null, nodes[i]);

flag |= (null != value);

obj.setParamater(nodes[i], value);

}

if (flag) {

list.add(obj);

}

Constructor<T> constructor = (Constructor<T>) obj.getClass().getConstructor();

obj = constructor.newInstance();

break;

case XmlPullParser.END_TAG:

break;

}

eventType = pullParser.next();

}

return list;

}


⑨如何使用類別B的解析。

復制代碼 代碼如下:

ArrayList<TmInfo>  datas = (ArrayList<TmInfo>) XmlUtils.stream2Tm(result, new TmInfo());

總結:雖然這里只是寫了這兩種類型,但是可以根據這種反射機制的思路完成更復雜的xml解析。使用的時候一定要注意變量命名的規范。用這樣的方式進行解析的話代碼設計更優雅,而且xml解析的時候會根據你的變量去解析,而不是寫死。

轉載自:http://www.cnblogs.com/vanezkw/archive/2013/03/03/2941496.html

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人午夜激情视频| 亚洲free性xxxx护士白浆| 久久久噜噜噜久噜久久| 久久精品这里热有精品| 欧美电影免费观看高清完整| 欧美人在线观看| 亚洲自拍欧美色图| 亚洲韩国日本中文字幕| 欧美性猛交xxxx乱大交3| 国产精品久久久久久久久影视| 中文字幕亚洲欧美日韩在线不卡| 亚洲精品一区二区三区不| 欧美性猛交xxxx免费看漫画| 日本久久久久久久久| 欧美国产日韩一区二区三区| 97超级碰在线看视频免费在线看| 一区二区三区四区在线观看视频| 国产小视频国产精品| 亚洲free性xxxx护士hd| 日韩精品视频在线免费观看| 黑人极品videos精品欧美裸| 夜夜嗨av一区二区三区免费区| 国产精品久久久久一区二区| 久久伊人精品一区二区三区| 国产一区二区三区在线| 欧美日本亚洲视频| 久久精品人人做人人爽| 久久久久久久久久久国产| 亚洲成人激情图| 91理论片午午论夜理片久久| 国内精品模特av私拍在线观看| 亚洲天堂男人天堂| 日本精品一区二区三区在线| 日本一区二区在线免费播放| 日韩免费观看在线观看| 热久久这里只有精品| 精品久久久久久中文字幕一区奶水| 精品国产欧美成人夜夜嗨| 欧美大片网站在线观看| 91精品久久久久久综合乱菊| 日韩视频在线一区| 超碰精品一区二区三区乱码| 98视频在线噜噜噜国产| 欧美一区二区.| 日韩在线观看免费| 国产亚洲精品va在线观看| 国产精品久久久久av免费| 久久久精品免费视频| 亚洲精品在线看| 成人春色激情网| 国产一区二区三区在线免费观看| 成人在线一区二区| 欧美激情视频一区二区三区不卡| 性欧美亚洲xxxx乳在线观看| 国产成人+综合亚洲+天堂| 欧美老女人xx| 久久亚洲欧美日韩精品专区| 久久青草福利网站| 欧美一级黑人aaaaaaa做受| 青青草成人在线| 欧美成人高清视频| 欧美乱妇高清无乱码| 亚洲国产美女精品久久久久∴| www.亚洲天堂| 草民午夜欧美限制a级福利片| 91免费精品国偷自产在线| 亚洲成色777777女色窝| 91亚洲一区精品| 国产a∨精品一区二区三区不卡| 欧美亚洲另类在线| 亚洲成av人片在线观看香蕉| 久久成人国产精品| 久久免费少妇高潮久久精品99| 国产成人在线亚洲欧美| 亚洲精品视频在线观看视频| 国产精品日韩欧美大师| 欧美成人小视频| 亚洲一区中文字幕| 亚洲欧美一区二区精品久久久| 日韩免费高清在线观看| 欧美野外wwwxxx| 91精品国产综合久久久久久蜜臀| 亚洲va男人天堂| 久久久久久久久久久亚洲| 不用播放器成人网| 亚洲国产成人久久综合| 91国产美女在线观看| 日韩高清电影免费观看完整版| 日韩av免费在线播放| 欧美激情久久久久| 色系列之999| 国产免费成人av| 91精品国产91久久久久福利| www.亚洲男人天堂| 国产精品视频午夜| 成人性生交大片免费看小说| 91日本在线视频| 日韩视频在线免费| 精品久久久久国产| 国产精品成av人在线视午夜片| 久久久久久久色| 8050国产精品久久久久久| 热re99久久精品国产66热| 国产精品jvid在线观看蜜臀| 精品中文视频在线| 久久久之久亚州精品露出| 欧美一区二区三区……| 欧美视频第一页| 免费不卡欧美自拍视频| y97精品国产97久久久久久| 91精品啪aⅴ在线观看国产| 成人xvideos免费视频| 91精品国产91久久久久久| 中文欧美日本在线资源| 国产v综合v亚洲欧美久久| 欧美最近摘花xxxx摘花| 欧美第一淫aaasss性| 国产精品入口夜色视频大尺度| 4438全国成人免费| 国产成人精品一区二区在线| 性欧美xxxx视频在线观看| 亚洲第一精品夜夜躁人人躁| 亚洲xxxx做受欧美| 日韩不卡在线观看| 国产99视频精品免视看7| 91视频8mav| 亚洲男人天堂手机在线| 久久精品国产精品亚洲| 8090成年在线看片午夜| 国产在线精品一区免费香蕉| 日韩在线视频网站| 91精品久久久久久久久久久久久| 日韩欧美a级成人黄色| 91亚洲精品在线观看| 久久久亚洲欧洲日产国码aⅴ| 国产在线视频欧美| 国产精品96久久久久久| 亚洲一区亚洲二区亚洲三区| 国产激情视频一区| 欧美一区二区三区艳史| 一区二区三区回区在观看免费视频| 欧美日韩ab片| 亚洲www永久成人夜色| 日韩av在线一区二区| 亚洲国产91精品在线观看| 亚洲国产私拍精品国模在线观看| 欧美亚洲视频在线看网址| 一级做a爰片久久毛片美女图片| 亚洲黄页视频免费观看| 亚洲精品动漫100p| 国产在线高清精品| 午夜精品一区二区三区在线| 国产精品国产三级国产专播精品人| 亚洲free性xxxx护士hd| 欧美色道久久88综合亚洲精品| 中文字幕亚洲自拍| 中文字幕视频在线免费欧美日韩综合在线看| 午夜精品视频网站| 秋霞午夜一区二区| 韩剧1988在线观看免费完整版| 久色乳综合思思在线视频| 欧美日韩国产精品一区二区三区四区| 欧美日韩福利电影| 国产精品亚洲网站|