Android編程簡(jiǎn)易實(shí)現(xiàn)XML解析的方法詳解
本文實(shí)例講述了Android編程簡(jiǎn)易實(shí)現(xiàn)XML解析的方法。分享給大家供大家參考,具體如下:
首先創(chuàng)建在Android工程中創(chuàng)建一個(gè)Assets文件夾 app/src/main/assets

在這里添加一個(gè)名為 data.xml的文件,然后編輯這個(gè)文件,加入如下XML格式內(nèi)容
<?xml version="1.0" encoding="utf-8"?>
<apps>
<app>
<id>1</id>
<name>Google Maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Google play</name>
<version>2.3</version>
</app>
</apps>
==============獲取XML中內(nèi)容================
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//獲取XML文件的輸入流
InputStream fis = getResources().getAssets().open("data.xml");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
StringBuffer stringBuffer = new StringBuffer();
int mark = -1;
while ((mark = isr.read()) != -1) {
stringBuffer.append((char) mark);
}
String data = stringBuffer.toString();
//把整個(gè)文件內(nèi)容以String方式傳入
//parseXMLWithPull(data);
//parseXMLWithSAX(data);
} catch (IOException e) {
e.printStackTrace();
}
}
==============Pull解析方式=================
獲取解析工具XmlPullParser:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser();
傳入XML字符流:
xmlPullParser.setInput(new StringReader(xmlData));
根據(jù)節(jié)點(diǎn)特征進(jìn)行處理:
switch ( xmlPullParser.getEventType() )
private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
while (eventType != xmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
//開(kāi)始解析某個(gè)節(jié)點(diǎn)
case XmlPullParser.START_TAG: {
if ("id".equals(nodeName)) {
id = xmlPullParser.nextText();
} else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
} else if ("version".equals(nodeName)) {
version = xmlPullParser.nextText();
}
}
break;
//完成解析某個(gè)節(jié)點(diǎn)
case XmlPullParser.END_TAG: {
if ("app".equals(nodeName)) {
Log.d("woider", "id is " + id);
Log.d("woider", "name is " + name);
Log.d("woider", "version is " + version);
}
}
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
==============SAX解析方式=================
使用SAX解析通常需要?jiǎng)?chuàng)建一個(gè)類繼承DefaultHandler,并重寫(xiě)父類的五個(gè)方法
startDocument():開(kāi)始XML解析的時(shí)候調(diào)用
startElement():開(kāi)始解析某個(gè)結(jié)點(diǎn)的時(shí)候調(diào)用
characters():獲取節(jié)點(diǎn)中內(nèi)容的時(shí)候調(diào)用
endElement():完成解析某個(gè)節(jié)點(diǎn)的時(shí)候調(diào)用
endDocument():完成整個(gè)XML解析的時(shí)候調(diào)用
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
//記住當(dāng)前結(jié)點(diǎn)名
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//進(jìn)行格式規(guī)范化
String str = new String(ch, start, length).trim();
//根據(jù)當(dāng)前節(jié)點(diǎn)名添加內(nèi)容
if ("id".equals(nodeName)) {
id.append(str);
} else if ("name".equals(nodeName)) {
name.append(str);
} else if ("version".equals(nodeName)) {
version.append(str);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)) {
Log.d("woider", "id is " + id);
Log.d("woider", "name is " + name);
Log.d("woider", "version is " + version);
//清空StringBuilder
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {
}
}
獲取解析工具XMLReader:
SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlReader = factory.newSAXParser().getXMLReader();
傳入規(guī)則到解析工具:
ContentHandler handler = new ContentHandler(); xmlReader.setContentHandler(handler);
開(kāi)始執(zhí)行解析:
xmlReader.parse(new InputSource(new StringReader(xmlData)));
private void parseXMLWithSAX(String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//將ContentHandler的實(shí)例設(shè)置到XMLReader中
xmlReader.setContentHandler(handler);
//開(kāi)始執(zhí)行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}
方法二(直接針對(duì)InputStream解析)
獲取解析工具SAXParser:
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser();
獲取規(guī)則和輸入流:
handler = new ParserHandler();
InputStream inputStream = getResources().getAssets().open("data.xml");
同時(shí)傳入開(kāi)始解析:
parser.parse(inputStream, handler);
最后打印 LogCat 中的日志,data.xml的解析就完成了

除了 Pull 解析和 SAX 解析之外,還有一種 DOM 解析也非常重要。
另外還有一些XML解析工具,比如 JDOM 和 DOM4J,它們簡(jiǎn)化了解析的步驟,提高了解析的效率。
PS:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:
在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson
在線格式化XML/在線壓縮XML:
http://tools.jb51.net/code/xmlformat
XML在線壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代碼在線格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android操作XML數(shù)據(jù)技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android?XML數(shù)據(jù)解析要點(diǎn)介紹
- Android中的xml解析介紹
- Android實(shí)現(xiàn)向本地寫(xiě)入一個(gè)XML文件和解析XML文件
- 淺談Android Studio 解析XML的三種方法
- Android解析XML文件升級(jí)APK的方法
- Android中對(duì)xml文件解析的3種方式總結(jié)
- Android開(kāi)發(fā)中解析xml文件XmlUtils工具類與用法示例
- Android xml解析實(shí)例詳解
- Android開(kāi)發(fā)筆記XML數(shù)據(jù)解析方法及優(yōu)缺點(diǎn)
相關(guān)文章
Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法,涉及Android針對(duì)按鈕元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-11-11
Android監(jiān)聽(tīng)Home鍵和Back鍵的區(qū)別介紹
這篇文章主要介紹了Android監(jiān)聽(tīng)Home鍵和Back鍵的區(qū)別介紹,本文還同時(shí)給出了Home鍵監(jiān)聽(tīng)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
Android實(shí)現(xiàn)自定義標(biāo)題欄的方法
這篇文章主要介紹了Android實(shí)現(xiàn)自定義標(biāo)題欄的方法,需要的朋友可以參考下2015-12-12
Android實(shí)現(xiàn)iPhone晃動(dòng)撤銷(xiāo)輸入功能 Android仿微信搖一搖功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)iPhone晃動(dòng)撤銷(xiāo)輸入功能,Android仿微信搖一搖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android實(shí)現(xiàn)取消GridView中Item選中時(shí)默認(rèn)的背景色
這篇文章主要介紹了Android實(shí)現(xiàn)取消GridView中Item選中時(shí)默認(rèn)的背景色,涉及Android GridView中Item屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android自定義控件實(shí)現(xiàn)圓形進(jìn)度CircleProgressBar
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)圓形進(jìn)度CircleProgressBar,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Android UI設(shè)計(jì)與開(kāi)發(fā)之仿人人網(wǎng)V5.9.2最新版引導(dǎo)界面
這篇文章主要為大家詳細(xì)介紹了Android UI設(shè)計(jì)與開(kāi)發(fā)之仿人人網(wǎng)V5.9.2最新版引導(dǎo)界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

