Android編程簡易實現(xiàn)XML解析的方法詳解
本文實例講述了Android編程簡易實現(xiàn)XML解析的方法。分享給大家供大家參考,具體如下:
首先創(chuàng)建在Android工程中創(chuàng)建一個Assets文件夾 app/src/main/assets
在這里添加一個名為 data.xml的文件,然后編輯這個文件,加入如下XML格式內容
<?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中內容================
@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(); //把整個文件內容以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é)點特征進行處理:
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) { //開始解析某個節(jié)點 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; //完成解析某個節(jié)點 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解析通常需要創(chuàng)建一個類繼承DefaultHandler,并重寫父類的五個方法
startDocument()
:開始XML解析的時候調用
startElement()
:開始解析某個結點的時候調用
characters()
:獲取節(jié)點中內容的時候調用
endElement()
:完成解析某個節(jié)點的時候調用
endDocument()
:完成整個XML解析的時候調用
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 { //記住當前結點名 nodeName = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { //進行格式規(guī)范化 String str = new String(ch, start, length).trim(); //根據(jù)當前節(jié)點名添加內容 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);
開始執(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的實例設置到XMLReader中 xmlReader.setContentHandler(handler); //開始執(zhí)行解析 xmlReader.parse(new InputSource(new StringReader(xmlData))); } catch (Exception e) { e.printStackTrace(); } }
方法二(直接針對InputStream解析)
獲取解析工具SAXParser:
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser();
獲取規(guī)則和輸入流:
handler = new ParserHandler(); InputStream inputStream = getResources().getAssets().open("data.xml");
同時傳入開始解析:
parser.parse(inputStream, handler);
最后打印 LogCat 中的日志,data.xml的解析就完成了
除了 Pull 解析和 SAX 解析之外,還有一種 DOM 解析也非常重要。
另外還有一些XML解析工具,比如 JDOM 和 DOM4J,它們簡化了解析的步驟,提高了解析的效率。
PS:這里再為大家提供幾款關于xml操作的在線工具供大家參考使用:
在線XML/JSON互相轉換工具:
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
更多關于Android相關內容感興趣的讀者可查看本站專題:《Android操作XML數(shù)據(jù)技巧總結》、《Android編程之a(chǎn)ctivity操作技巧總結》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開發(fā)入門與進階教程》、《Android視圖View技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
相關文章
分享Android中ExpandableListView控件使用教程
這篇文章主要介紹了Android中ExpandableListView控件使用教程,可以實現(xiàn)二級列表展示效果,需要的朋友可以參考下2015-12-12Android DrawableTextView圖片文字居中顯示實例
在我們開發(fā)中,TextView設置Android:drawableLeft一定使用的非常多,但Drawable和Text同時居中顯示可能不好控制,小編想到通過自定義TextView實現(xiàn),具體詳情大家參考下本文2017-03-03Android Chronometer控件實現(xiàn)計時器函數(shù)詳解
這篇文章主要為大家詳細介紹了Android Chronometer控件實現(xiàn)計時器函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-04-04Android實現(xiàn)動態(tài)自動匹配輸入內容功能
這篇文章主要為大家詳細介紹了Android實現(xiàn)動態(tài)自動匹配輸入內容功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06andoid打包短信發(fā)送到gmail郵箱實現(xiàn)代碼
andriod短信整合備份發(fā)送到gmail郵箱,需要在andoid手機配置好gmail郵箱,下面是具體的實現(xiàn)代碼,感興趣的朋友可以參考下哈2013-06-06android使用ViewPager實現(xiàn)圖片自動切換
這篇文章主要為大家詳細介紹了android使用ViewPager實現(xiàn)圖片自動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02Android RenderScript實現(xiàn)高斯模糊
這篇文章主要為大家詳細介紹了Android RenderScript實現(xiàn)高斯模糊的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12