欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android通用xml解析方法

 更新時(shí)間:2013年03月03日 15:18:50   作者:  
之前做的網(wǎng)絡(luò)相關(guān)的應(yīng)用,里面涉及到了xml的解析,由于急于完成任務(wù)也沒有設(shè)計(jì)就直接敲代碼。這幾天給一個(gè)朋友做項(xiàng)目的時(shí)候也涉及到了xml的解析,而且解析的內(nèi)容比較多,我查看了以前的項(xiàng)目中的相關(guān)代碼,頓時(shí)覺得很多代碼都是可以優(yōu)化的。在此寫兩個(gè)通用的xml解析方法,當(dāng)然這里所講的通用只是在一定程度上并且需要遵守一些規(guī)范。

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

當(dāng)需要解析不同的xml節(jié)點(diǎn)。你有可能是在xml解析的時(shí)候匹配不同節(jié)點(diǎn)并且節(jié)點(diǎn)名都是寫死的,這樣的話你解析不同的節(jié)點(diǎn)就需要不同的解析方法。當(dāng)然這種方式是最簡單也是最笨的方法。為了減少代碼把代碼寫得更有質(zhì)量那么你就需要考慮設(shè)計(jì)一個(gè)通用的xml解析方法。

2、解析思路。

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

3、解析xml的格式類型。

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

①只有節(jié)點(diǎn)中內(nèi)容:如

復(fù)制代碼 代碼如下:

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

<Result>

  <StuId>30323</StuId>

  <ClassID>10042</ClassID>

</Result>


②只有節(jié)點(diǎn)屬性:如

復(fù)制代碼 代碼如下:

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

<Result>

   <ProjLst Name="測(cè)試1" Id="1" />

   <ProjLst Name="測(cè)試2" Id="2" />

   <ProjLst Name="測(cè)試3" Id="3" />

</Result>


4、如何實(shí)現(xiàn)。

①根據(jù)設(shè)計(jì)思路,你需要一個(gè)實(shí)體類,但是實(shí)體類有一定的規(guī)范(為了解析)。所以這些規(guī)范還需要實(shí)現(xiàn)一些統(tǒng)一的方法,于是就有了一個(gè)抽象類:BaseObj。

復(fù)制代碼 代碼如下:

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

}

}

}


②根據(jù)具體的節(jié)點(diǎn)類型生成類的成員。這里先看看需要解析的xml。

復(fù)制代碼 代碼如下:

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

  <DsXml>

  <IsLog>true</IsLog>

  <GradeID>10001</GradeID>

  <GradeName>高一年級(jí)</GradeName>

  <ClassID>10010</ClassID>

  <ClassName>高一(01)班</ClassName>

  <UserID>10000</UserID>

  <UserName>張三</UserName>

  </DsXml>


③對(duì)應(yīng)的實(shí)體類。

復(fù)制代碼 代碼如下:

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" };

}

}


實(shí)體類中的是這樣規(guī)范的:getNodes()返回的是xml的節(jié)點(diǎn)名,命名必須相同,并且成員變量名必須和節(jié)點(diǎn)名相同。當(dāng)然這里實(shí)現(xiàn)Serializable 接口只是我自己的項(xiàng)目中的需求而已,和本文無關(guān)。

④最關(guān)鍵是如何解析。

復(fù)制代碼 代碼如下:

View Code

/**

 * @description :解析節(jié)點(diǎn)中的內(nèi)容,封裝成對(duì)象模型。

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

}

}


當(dāng)然里面的一些變量在類初始化的時(shí)候就完成了。如下:

復(fù)制代碼 代碼如下:

private static String encode = "utf-8";

public static XmlPullParser pullParser;

static {

try {

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

  } catch (XmlPullParserException e) {

  e.printStackTrace();

}

}


⑤如何使用.如下:

復(fù)制代碼 代碼如下:

XmlUtils.streamText2Model(result, ActMain.student);

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

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

復(fù)制代碼 代碼如下:

View Code

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

  <DsXml>

  <ProjLst KeliName="測(cè)試1" KeliId="170" SubId="13" ExeTp="1" ExeType="預(yù)習(xí)" ExeDt="2013-2-27" ExeCount="4" SubName="信息技術(shù)" />

  <ProjLst KeliName="測(cè)試2" KeliId="154" SubId="13" ExeTp="1" ExeType="預(yù)習(xí)" ExeDt="2012-11-19" ExeCount="2" SubName="信息技術(shù)" />

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

  </DsXml>


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

復(fù)制代碼 代碼如下:

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解析方法如下:

復(fù)制代碼 代碼如下:

View Code

/**

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

 * @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的解析。

復(fù)制代碼 代碼如下:

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

總結(jié):雖然這里只是寫了這兩種類型,但是可以根據(jù)這種反射機(jī)制的思路完成更復(fù)雜的xml解析。使用的時(shí)候一定要注意變量命名的規(guī)范。用這樣的方式進(jìn)行解析的話代碼設(shè)計(jì)更優(yōu)雅,而且xml解析的時(shí)候會(huì)根據(jù)你的變量去解析,而不是寫死。

轉(zhuǎn)載自:http://www.cnblogs.com/vanezkw/archive/2013/03/03/2941496.html

相關(guān)文章

最新評(píng)論