日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android中解析XML---数据存储

發(fā)布時(shí)間:2024/4/17 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中解析XML---数据存储 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://blog.csdn.net/liuhe688/article/details/6415593

XML在各種開(kāi)發(fā)中都廣泛應(yīng)用,Android也不例外。作為承載數(shù)據(jù)的一個(gè)重要角色,如何讀寫(xiě)XML成為Android開(kāi)發(fā)中一項(xiàng)重要的技能。今天就由我向大家介紹一下在Android平臺(tái)下幾種常見(jiàn)的XML解析和創(chuàng)建的方法。

在Android中,常見(jiàn)的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面,我將一一向大家詳細(xì)介紹。

SAX解析器:

SAX(Simple API for XML)解析器是一種基于事件的解析器,它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來(lái)工作的。當(dāng)事件源產(chǎn)生事件后,調(diào)用事件處理器相應(yīng)的處理方法,一個(gè)事件就可以得到處理。在事件源調(diào)用事件處理器中特定方法的時(shí)候,還要傳遞給事件處理器相應(yīng)事件的狀態(tài)信息,這樣事件處理器才能夠根據(jù)提供的事件信息來(lái)決定自己的行為。

SAX解析器的優(yōu)點(diǎn)是解析速度快,占用內(nèi)存少。非常適合在Android移動(dòng)設(shè)備中使用。

DOM解析器:

DOM是基于樹(shù)形結(jié)構(gòu)的的節(jié)點(diǎn)或信息片段的集合,允許開(kāi)發(fā)人員使用DOM API遍歷XML樹(shù)、檢索所需數(shù)據(jù)。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造樹(shù)形結(jié)構(gòu),然后才可以檢索和更新節(jié)點(diǎn)信息。

由于DOM在內(nèi)存中以樹(shù)形結(jié)構(gòu)存放,因此檢索和更新效率會(huì)更高。但是對(duì)于特別大的文檔,解析和加載整個(gè)文檔將會(huì)很耗資源。

PULL解析器:

PULL解析器的運(yùn)行方式和SAX類(lèi)似,都是基于事件的模式。不同的是,在PULL解析過(guò)程中,我們需要自己獲取產(chǎn)生的事件然后做相應(yīng)的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法,執(zhí)行我們的代碼。PULL解析器小巧輕便,解析速度快,簡(jiǎn)單易用,非常適合在Android移動(dòng)設(shè)備中使用,Android系統(tǒng)內(nèi)部在解析各種XML時(shí)也是用PULL解析器。

以上三種解析器,都是非常實(shí)用的解析器,我將會(huì)一一介紹。我們將會(huì)使用這三種解析技術(shù)完成一項(xiàng)共同的任務(wù)。

我們新建一個(gè)項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:

我會(huì)在項(xiàng)目的assets目錄中放置一個(gè)XML文檔books.xml,內(nèi)容如下:

?

[xhtml]?view plaincopy
  • <?xml?version="1.0"?encoding="utf-8"?>??
  • <books>??
  • ????<book>??
  • ????????<id>1001</id>??
  • ????????<name>Thinking?In?Java</name>??
  • ????????<price>80.00</price>??
  • ????</book>??
  • ????<book>??
  • ????????<id>1002</id>??
  • ????????<name>Core?Java</name>??
  • ????????<price>90.00</price>??
  • ????</book>??
  • ????<book>??
  • ????????<id>1003</id>??
  • ????????<name>Hello,?Andriod</name>??
  • ????????<price>100.00</price>??
  • ????</book>??
  • </books>??
  • ?

    然后我們分別使用以上三種解析技術(shù)解析文檔,得到一個(gè)List<Book>的對(duì)象,先來(lái)看一下Book.java的代碼:

    ?

    [java]?view plaincopy
  • package?com.scott.xml.model;??
  • ??
  • public?class?Book?{??
  • ????private?int?id;??
  • ????private?String?name;??
  • ????private?float?price;??
  • ??????
  • ????public?int?getId()?{??
  • ????????return?id;??
  • ????}??
  • ??
  • ????public?void?setId(int?id)?{??
  • ????????this.id?=?id;??
  • ????}??
  • ??
  • ????public?String?getName()?{??
  • ????????return?name;??
  • ????}??
  • ??
  • ????public?void?setName(String?name)?{??
  • ????????this.name?=?name;??
  • ????}??
  • ??
  • ????public?float?getPrice()?{??
  • ????????return?price;??
  • ????}??
  • ??
  • ????public?void?setPrice(float?price)?{??
  • ????????this.price?=?price;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?String?toString()?{??
  • ????????return?"id:"?+?id?+?",?name:"?+?name?+?",?price:"?+?price;??
  • ????}??
  • }??
  • ?

    最后,我們還要把這個(gè)集合對(duì)象中的數(shù)據(jù)生成一個(gè)新的XML文檔,如圖:

    生成的XML結(jié)構(gòu)跟原始文檔略有不同,是下面這種格式:

    ?

    [xhtml]?view plaincopy
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <books>??
  • ??<book?id="1001">??
  • ????<name>Thinking?In?Java</name>??
  • ????<price>80.0</price>??
  • ??</book>??
  • ??<book?id="1002">??
  • ????<name>Core?Java</name>??
  • ????<price>90.0</price>??
  • ??</book>??
  • ??<book?id="1003">??
  • ????<name>Hello,?Andriod</name>??
  • ????<price>100.0</price>??
  • ??</book>??
  • </books>??
  • ?

    接下來(lái),就該介紹操作過(guò)程了,我們先為解析器定義一個(gè)BookParser接口,每種類(lèi)型的解析器需要實(shí)現(xiàn)此接口。BookParser.java代碼如下:

    ?

    [java]?view plaincopy
  • package?com.scott.xml.parser;??
  • ??
  • import?java.io.InputStream;??
  • import?java.util.List;??
  • ??
  • import?com.scott.xml.model.Book;??
  • ??
  • public?interface?BookParser?{??
  • ????/**?
  • ?????*?解析輸入流?得到Book對(duì)象集合?
  • ?????*?@param?is?
  • ?????*?@return?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?List<Book>?parse(InputStream?is)?throws?Exception;??
  • ??????
  • ????/**?
  • ?????*?序列化Book對(duì)象集合?得到XML形式的字符串?
  • ?????*?@param?books?
  • ?????*?@return?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?String?serialize(List<Book>?books)?throws?Exception;??
  • }??
  • ?

    好了,我們就該一個(gè)一個(gè)的實(shí)現(xiàn)該接口,完成我們的解析過(guò)程。

    使用SAX解析器:

    SaxBookParser.java代碼如下:

    ?

    [c-sharp]?view plaincopy
  • package?com.scott.xml.parser;??
  • ??
  • import?java.io.InputStream;??
  • import?java.io.StringWriter;??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • import?javax.xml.parsers.SAXParser;??
  • import?javax.xml.parsers.SAXParserFactory;??
  • import?javax.xml.transform.OutputKeys;??
  • import?javax.xml.transform.Result;??
  • import?javax.xml.transform.Transformer;??
  • import?javax.xml.transform.TransformerFactory;??
  • import?javax.xml.transform.sax.SAXTransformerFactory;??
  • import?javax.xml.transform.sax.TransformerHandler;??
  • import?javax.xml.transform.stream.StreamResult;??
  • ??
  • import?org.xml.sax.Attributes;??
  • import?org.xml.sax.SAXException;??
  • import?org.xml.sax.helpers.AttributesImpl;??
  • import?org.xml.sax.helpers.DefaultHandler;??
  • ??
  • import?com.scott.xml.model.Book;??
  • ??
  • public?class?SaxBookParser?implements?BookParser?{??
  • ??????
  • ????@Override??
  • ????public?List<Book>?parse(InputStream?is)?throws?Exception?{??
  • ????????SAXParserFactory?factory?=?SAXParserFactory.newInstance();??//取得SAXParserFactory實(shí)例??
  • ????????SAXParser?parser?=?factory.newSAXParser();??????????????????//從factory獲取SAXParser實(shí)例??
  • ????????MyHandler?handler?=?new?MyHandler();????????????????????????//實(shí)例化自定義Handler??
  • ????????parser.parse(is,?handler);??????????????????????????????????//根據(jù)自定義Handler規(guī)則解析輸入流??
  • ????????return?handler.getBooks();??
  • ????}??
  • ??
  • ????@Override??
  • ????public?String?serialize(List<Book>?books)?throws?Exception?{??
  • ????????SAXTransformerFactory?factory?=?(SAXTransformerFactory)?TransformerFactory.newInstance();//取得SAXTransformerFactory實(shí)例??
  • ????????TransformerHandler?handler?=?factory.newTransformerHandler();???????????//從factory獲取TransformerHandler實(shí)例??
  • ????????Transformer?transformer?=?handler.getTransformer();?????????????????????//從handler獲取Transformer實(shí)例??
  • ????????transformer.setOutputProperty(OutputKeys.ENCODING,?"UTF-8");????????????//?設(shè)置輸出采用的編碼方式??
  • ????????transformer.setOutputProperty(OutputKeys.INDENT,?"yes");????????????????//?是否自動(dòng)添加額外的空白??
  • ????????transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,?"no");???//?是否忽略XML聲明??
  • ??????????
  • ????????StringWriter?writer?=?new?StringWriter();??
  • ????????Result?result?=?new?StreamResult(writer);??
  • ????????handler.setResult(result);??
  • ??????????
  • ????????String?uri?=?"";????//代表命名空間的URI?當(dāng)URI無(wú)值時(shí)?須置為空字符串??
  • ????????String?localName?=?"";??//命名空間的本地名稱(chēng)(不包含前綴)?當(dāng)沒(méi)有進(jìn)行命名空間處理時(shí)?須置為空字符串??
  • ??????????
  • ????????handler.startDocument();??
  • ????????handler.startElement(uri,?localName,?"books",?null);??
  • ??????????
  • ????????AttributesImpl?attrs?=?new?AttributesImpl();????//負(fù)責(zé)存放元素的屬性信息??
  • ????????char[]?ch?=?null;??
  • ????????for?(Book?book?:?books)?{??
  • ????????????attrs.clear();??//清空屬性列表??
  • ????????????attrs.addAttribute(uri,?localName,?"id",?"string",?String.valueOf(book.getId()));//添加一個(gè)名為id的屬性(type影響不大,這里設(shè)為string)??
  • ????????????handler.startElement(uri,?localName,?"book",?attrs);????//開(kāi)始一個(gè)book元素?關(guān)聯(lián)上面設(shè)定的id屬性??
  • ??????????????
  • ????????????handler.startElement(uri,?localName,?"name",?null);?//開(kāi)始一個(gè)name元素?沒(méi)有屬性??
  • ????????????ch?=?String.valueOf(book.getName()).toCharArray();??
  • ????????????handler.characters(ch,?0,?ch.length);???//設(shè)置name元素的文本節(jié)點(diǎn)??
  • ????????????handler.endElement(uri,?localName,?"name");??
  • ??????????????
  • ????????????handler.startElement(uri,?localName,?"price",?null);//開(kāi)始一個(gè)price元素?沒(méi)有屬性??
  • ????????????ch?=?String.valueOf(book.getPrice()).toCharArray();??
  • ????????????handler.characters(ch,?0,?ch.length);???//設(shè)置price元素的文本節(jié)點(diǎn)??
  • ????????????handler.endElement(uri,?localName,?"price");??
  • ??????????????
  • ????????????handler.endElement(uri,?localName,?"book");??
  • ????????}??
  • ????????handler.endElement(uri,?localName,?"books");??
  • ????????handler.endDocument();??
  • ??????????
  • ????????return?writer.toString();??
  • ????}??
  • ??????
  • ????//需要重寫(xiě)DefaultHandler的方法??
  • ????private?class?MyHandler?extends?DefaultHandler?{??
  • ??
  • ????????private?List<Book>?books;??
  • ????????private?Book?book;??
  • ????????private?StringBuilder?builder;??
  • ??????????
  • ????????//返回解析后得到的Book對(duì)象集合??
  • ????????public?List<Book>?getBooks()?{??
  • ????????????return?books;??
  • ????????}??
  • ??????????
  • ????????@Override??
  • ????????public?void?startDocument()?throws?SAXException?{??
  • ????????????super.startDocument();??
  • ????????????books?=?new?ArrayList<Book>();??
  • ????????????builder?=?new?StringBuilder();??
  • ????????}??
  • ??
  • ????????@Override??
  • ????????public?void?startElement(String?uri,?String?localName,?String?qName,?Attributes?attributes)?throws?SAXException?{??
  • ????????????super.startElement(uri,?localName,?qName,?attributes);??
  • ????????????if?(localName.equals("book"))?{??
  • ????????????????book?=?new?Book();??
  • ????????????}??
  • ????????????builder.setLength(0);???//將字符長(zhǎng)度設(shè)置為0?以便重新開(kāi)始讀取元素內(nèi)的字符節(jié)點(diǎn)??
  • ????????}??
  • ??????????
  • ????????@Override??
  • ????????public?void?characters(char[]?ch,?int?start,?int?length)?throws?SAXException?{??
  • ????????????super.characters(ch,?start,?length);??
  • ????????????builder.append(ch,?start,?length);??//將讀取的字符數(shù)組追加到builder中??
  • ????????}??
  • ??????????
  • ????????@Override??
  • ????????public?void?endElement(String?uri,?String?localName,?String?qName)?throws?SAXException?{??
  • ????????????super.endElement(uri,?localName,?qName);??
  • ????????????if?(localName.equals("id"))?{??
  • ????????????????book.setId(Integer.parseInt(builder.toString()));??
  • ????????????}?else?if?(localName.equals("name"))?{??
  • ????????????????book.setName(builder.toString());??
  • ????????????}?else?if?(localName.equals("price"))?{??
  • ????????????????book.setPrice(Float.parseFloat(builder.toString()));??
  • ????????????}?else?if?(localName.equals("book"))?{??
  • ????????????????books.add(book);??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • ?

    代碼中,我們定義了自己的事件處理邏輯,重寫(xiě)了DefaultHandler的幾個(gè)重要的事件方法。下面我為大家著重介紹一下DefaultHandler的相關(guān)知識(shí)。DefaultHandler是一個(gè)事件處理器,可以接收解析器報(bào)告的所有事件,處理所發(fā)現(xiàn)的數(shù)據(jù)。它實(shí)現(xiàn)了EntityResolver接口、DTDHandler接口、ErrorHandler接口和ContentHandler接口。這幾個(gè)接口代表不同類(lèi)型的事件處理器。我們著重介紹一下ContentHandler接口。結(jié)構(gòu)如圖:

    這幾個(gè)比較重要的方法已被我用紅線標(biāo)注,DefaultHandler實(shí)現(xiàn)了這些方法,但在方法體內(nèi)沒(méi)有做任何事情,因此我們?cè)谑褂脮r(shí)必須覆寫(xiě)相關(guān)的方法。最重要的是startElement方法、characters方法和endElement方法。當(dāng)執(zhí)行文檔時(shí)遇到起始節(jié)點(diǎn),startElement方法將會(huì)被調(diào)用,我們可以獲取起始節(jié)點(diǎn)相關(guān)信息;然后characters方法被調(diào)用,我們可以獲取節(jié)點(diǎn)內(nèi)的文本信息;最后endElement方法被調(diào)用,我們可以做收尾的相關(guān)操作。

    最后,我們需要調(diào)用SAX解析程序,這個(gè)步驟在MainActivity中完成:

    ?

    [java]?view plaincopy
  • package?com.scott.xml;??
  • ??
  • import?java.io.FileOutputStream;??
  • import?java.io.InputStream;??
  • import?java.util.List;??
  • ??
  • import?android.app.Activity;??
  • import?android.content.Context;??
  • import?android.os.Bundle;??
  • import?android.util.Log;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • ??
  • import?com.scott.xml.model.Book;??
  • import?com.scott.xml.parser.BookParser;??
  • import?com.scott.xml.parser.SaxBookParser;??
  • ??
  • public?class?MainActivity?extends?Activity?{??
  • ??????
  • ????private?static?final?String?TAG?=?"XML";??
  • ??????
  • ????private?BookParser?parser;??
  • ????private?List<Book>?books;??
  • ??????
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ??????????
  • ????????Button?readBtn?=?(Button)?findViewById(R.id.readBtn);??
  • ????????Button?writeBtn?=?(Button)?findViewById(R.id.writeBtn);??
  • ??????????
  • ????????readBtn.setOnClickListener(new?View.OnClickListener()?{??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????try?{??
  • ????????????????????InputStream?is?=?getAssets().open("books.xml");??
  • ????????????????????parser?=?new?SaxBookParser();??//創(chuàng)建SaxBookParser實(shí)例??
  • ????????????????????books?=?parser.parse(is);??//解析輸入流??
  • ????????????????????for?(Book?book?:?books)?{??
  • ????????????????????????Log.i(TAG,?book.toString());??
  • ????????????????????}??
  • ????????????????}?catch?(Exception?e)?{??
  • ????????????????????Log.e(TAG,?e.getMessage());??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ????????writeBtn.setOnClickListener(new?View.OnClickListener()?{??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????try?{??
  • ????????????????????String?xml?=?parser.serialize(books);??//序列化??
  • ????????????????????FileOutputStream?fos?=?openFileOutput("books.xml",?Context.MODE_PRIVATE);??
  • ????????????????????fos.write(xml.getBytes("UTF-8"));??
  • ????????????????}?catch?(Exception?e)?{??
  • ????????????????????Log.e(TAG,?e.getMessage());??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ????}??
  • }??
  • ?

    界面就兩個(gè)按鈕,順便給大家貼上:

    ?

    點(diǎn)擊“readXML”按鈕,將會(huì)調(diào)用SAX解析器解析文檔,并在日志臺(tái)打印相關(guān)信息:

    然后再點(diǎn)擊“writeXML”按鈕,將會(huì)在該應(yīng)用包下的files目錄生成一個(gè)books.xml文件:

    使用DOM解析器:

    DomBookParser.java代碼如下:

    ?

    [java]?view plaincopy
  • package?com.scott.xml.parser;??
  • ??
  • import?java.io.InputStream;??
  • import?java.io.StringWriter;??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • import?javax.xml.parsers.DocumentBuilder;??
  • import?javax.xml.parsers.DocumentBuilderFactory;??
  • import?javax.xml.transform.OutputKeys;??
  • import?javax.xml.transform.Result;??
  • import?javax.xml.transform.Source;??
  • import?javax.xml.transform.Transformer;??
  • import?javax.xml.transform.TransformerFactory;??
  • import?javax.xml.transform.dom.DOMSource;??
  • import?javax.xml.transform.stream.StreamResult;??
  • ??
  • import?org.w3c.dom.Document;??
  • import?org.w3c.dom.Element;??
  • import?org.w3c.dom.Node;??
  • import?org.w3c.dom.NodeList;??
  • ??
  • import?com.scott.xml.model.Book;??
  • ??
  • public?class?DomBookParser?implements?BookParser?{??
  • ??
  • ????@Override??
  • ????public?List<Book>?parse(InputStream?is)?throws?Exception?{??
  • ????????List<Book>?books?=?new?ArrayList<Book>();??
  • ????????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();??//取得DocumentBuilderFactory實(shí)例??
  • ????????DocumentBuilder?builder?=?factory.newDocumentBuilder();?//從factory獲取DocumentBuilder實(shí)例??
  • ????????Document?doc?=?builder.parse(is);???//解析輸入流?得到Document實(shí)例??
  • ????????Element?rootElement?=?doc.getDocumentElement();??
  • ????????NodeList?items?=?rootElement.getElementsByTagName("book");??
  • ????????for?(int?i?=?0;?i?<?items.getLength();?i++)?{??
  • ????????????Book?book?=?new?Book();??
  • ????????????Node?item?=?items.item(i);??
  • ????????????NodeList?properties?=?item.getChildNodes();??
  • ????????????for?(int?j?=?0;?j?<?properties.getLength();?j++)?{??
  • ????????????????Node?property?=?properties.item(j);??
  • ????????????????String?nodeName?=?property.getNodeName();??
  • ????????????????if?(nodeName.equals("id"))?{??
  • ????????????????????book.setId(Integer.parseInt(property.getFirstChild().getNodeValue()));??
  • ????????????????}?else?if?(nodeName.equals("name"))?{??
  • ????????????????????book.setName(property.getFirstChild().getNodeValue());??
  • ????????????????}?else?if?(nodeName.equals("price"))?{??
  • ????????????????????book.setPrice(Float.parseFloat(property.getFirstChild().getNodeValue()));??
  • ????????????????}??
  • ????????????}??
  • ????????????books.add(book);??
  • ????????}??
  • ????????return?books;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?String?serialize(List<Book>?books)?throws?Exception?{??
  • ????????DocumentBuilderFactory?factory?=?DocumentBuilderFactory.newInstance();??
  • ????????DocumentBuilder?builder?=?factory.newDocumentBuilder();??
  • ????????Document?doc?=?builder.newDocument();???//由builder創(chuàng)建新文檔??
  • ??????????
  • ????????Element?rootElement?=?doc.createElement("books");??
  • ??
  • ????????for?(Book?book?:?books)?{??
  • ????????????Element?bookElement?=?doc.createElement("book");??
  • ????????????bookElement.setAttribute("id",?book.getId()?+?"");??
  • ??????????????
  • ????????????Element?nameElement?=?doc.createElement("name");??
  • ????????????nameElement.setTextContent(book.getName());??
  • ????????????bookElement.appendChild(nameElement);??
  • ??????????????
  • ????????????Element?priceElement?=?doc.createElement("price");??
  • ????????????priceElement.setTextContent(book.getPrice()?+?"");??
  • ????????????bookElement.appendChild(priceElement);??
  • ??????????????
  • ????????????rootElement.appendChild(bookElement);??
  • ????????}??
  • ??????????
  • ????????doc.appendChild(rootElement);??
  • ??????????
  • ????????TransformerFactory?transFactory?=?TransformerFactory.newInstance();//取得TransformerFactory實(shí)例??
  • ????????Transformer?transformer?=?transFactory.newTransformer();????//從transFactory獲取Transformer實(shí)例??
  • ????????transformer.setOutputProperty(OutputKeys.ENCODING,?"UTF-8");????????????//?設(shè)置輸出采用的編碼方式??
  • ????????transformer.setOutputProperty(OutputKeys.INDENT,?"yes");????????????????//?是否自動(dòng)添加額外的空白??
  • ????????transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,?"no");???//?是否忽略XML聲明??
  • ??????????
  • ????????StringWriter?writer?=?new?StringWriter();??
  • ??????????
  • ????????Source?source?=?new?DOMSource(doc);?//表明文檔來(lái)源是doc??
  • ????????Result?result?=?new?StreamResult(writer);//表明目標(biāo)結(jié)果為writer??
  • ????????transformer.transform(source,?result);??//開(kāi)始轉(zhuǎn)換??
  • ??????????
  • ????????return?writer.toString();??
  • ????}??
  • ??
  • }??
  • ?

    然后再M(fèi)ainActivity中只需改一個(gè)地方:

    ?

    [java]?view plaincopy
  • ?????readBtn.setOnClickListener(new?View.OnClickListener()?{??
  • @Override??
  • public?void?onClick(View?v)?{??
  • ????try?{??
  • ????????InputStream?is?=?getAssets().open("books.xml");??
  • ?//?????????????parser?=?new?SaxBookParser();??
  • ????????parser?=?new?DomBookParser();??
  • ????????books?=?parser.parse(is);??
  • ????????for?(Book?book?:?books)?{??
  • ????????????Log.i(TAG,?book.toString());??
  • ????????}??
  • ????}?catch?(Exception?e)?{??
  • ????????Log.e(TAG,?e.getMessage());??
  • ????}??
  • }??
  • );??
  • ?

    執(zhí)行結(jié)果是一樣的。

    使用PULL解析器:

    PullBookParser.java代碼如下:

    ?

    [java]?view plaincopy
  • package?com.scott.xml.parser;??
  • ??
  • import?java.io.InputStream;??
  • import?java.io.StringWriter;??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • import?org.xmlpull.v1.XmlPullParser;??
  • import?org.xmlpull.v1.XmlSerializer;??
  • ??
  • import?android.util.Xml;??
  • ??
  • import?com.scott.xml.model.Book;??
  • ??
  • public?class?PullBookParser?implements?BookParser?{??
  • ??????
  • ????@Override??
  • ????public?List<Book>?parse(InputStream?is)?throws?Exception?{??
  • ????????List<Book>?books?=?null;??
  • ????????Book?book?=?null;??
  • ??????????
  • //??????XmlPullParserFactory?factory?=?XmlPullParserFactory.newInstance();??
  • //??????XmlPullParser?parser?=?factory.newPullParser();??
  • ??????????
  • ????????XmlPullParser?parser?=?Xml.newPullParser();?//由android.util.Xml創(chuàng)建一個(gè)XmlPullParser實(shí)例??
  • ????????parser.setInput(is,?"UTF-8");???????????????//設(shè)置輸入流?并指明編碼方式??
  • ??
  • ????????int?eventType?=?parser.getEventType();??
  • ????????while?(eventType?!=?XmlPullParser.END_DOCUMENT)?{??
  • ????????????switch?(eventType)?{??
  • ????????????case?XmlPullParser.START_DOCUMENT:??
  • ????????????????books?=?new?ArrayList<Book>();??
  • ????????????????break;??
  • ????????????case?XmlPullParser.START_TAG:??
  • ????????????????if?(parser.getName().equals("book"))?{??
  • ????????????????????book?=?new?Book();??
  • ????????????????}?else?if?(parser.getName().equals("id"))?{??
  • ????????????????????eventType?=?parser.next();??
  • ????????????????????book.setId(Integer.parseInt(parser.getText()));??
  • ????????????????}?else?if?(parser.getName().equals("name"))?{??
  • ????????????????????eventType?=?parser.next();??
  • ????????????????????book.setName(parser.getText());??
  • ????????????????}?else?if?(parser.getName().equals("price"))?{??
  • ????????????????????eventType?=?parser.next();??
  • ????????????????????book.setPrice(Float.parseFloat(parser.getText()));??
  • ????????????????}??
  • ????????????????break;??
  • ????????????case?XmlPullParser.END_TAG:??
  • ????????????????if?(parser.getName().equals("book"))?{??
  • ????????????????????books.add(book);??
  • ????????????????????book?=?null;??????
  • ????????????????}??
  • ????????????????break;??
  • ????????????}??
  • ????????????eventType?=?parser.next();??
  • ????????}??
  • ????????return?books;??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?String?serialize(List<Book>?books)?throws?Exception?{??
  • //??????XmlPullParserFactory?factory?=?XmlPullParserFactory.newInstance();??
  • //??????XmlSerializer?serializer?=?factory.newSerializer();??
  • ??????????
  • ????????XmlSerializer?serializer?=?Xml.newSerializer();?//由android.util.Xml創(chuàng)建一個(gè)XmlSerializer實(shí)例??
  • ????????StringWriter?writer?=?new?StringWriter();??
  • ????????serializer.setOutput(writer);???//設(shè)置輸出方向?yàn)閣riter??
  • ????????serializer.startDocument("UTF-8",?true);??
  • ????????serializer.startTag("",?"books");??
  • ????????for?(Book?book?:?books)?{??
  • ????????????serializer.startTag("",?"book");??
  • ????????????serializer.attribute("",?"id",?book.getId()?+?"");??
  • ??????????????
  • ????????????serializer.startTag("",?"name");??
  • ????????????serializer.text(book.getName());??
  • ????????????serializer.endTag("",?"name");??
  • ??????????????
  • ????????????serializer.startTag("",?"price");??
  • ????????????serializer.text(book.getPrice()?+?"");??
  • ????????????serializer.endTag("",?"price");??
  • ??????????????
  • ????????????serializer.endTag("",?"book");??
  • ????????}??
  • ????????serializer.endTag("",?"books");??
  • ????????serializer.endDocument();??
  • ??????????
  • ????????return?writer.toString();??
  • ????}??
  • }??
  • ?

    然后再對(duì)MainActivity做以下更改:

    ?

    [java]?view plaincopy
  • ????????readBtn.setOnClickListener(new?View.OnClickListener()?{??
  • ????????????@Override??
  • ????????????public?void?onClick(View?v)?{??
  • ????????????????try?{??
  • ????????????????????InputStream?is?=?getAssets().open("books.xml");??
  • //??????????????????parser?=?new?SaxBookParser();??
  • //??????????????????parser?=?new?DomBookParser();??
  • ????????????????????parser?=?new?PullBookParser();??
  • ????????????????????books?=?parser.parse(is);??
  • ????????????????????for?(Book?book?:?books)?{??
  • ????????????????????????Log.i(TAG,?book.toString());??
  • ????????????????????}??
  • ????????????????}?catch?(Exception?e)?{??
  • ????????????????????Log.e(TAG,?e.getMessage());??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ?

    和其他兩個(gè)執(zhí)行結(jié)果都一樣。

    對(duì)于這三種解析器各有優(yōu)點(diǎn),我個(gè)人比較傾向于PULL解析器,因?yàn)镾AX解析器操作起來(lái)太笨重,DOM不適合文檔較大,內(nèi)存較小的場(chǎng)景,唯有PULL輕巧靈活,速度快,占用內(nèi)存小,使用非常順手。讀者也可以根據(jù)自己的喜好選擇相應(yīng)的解析技術(shù)。

    轉(zhuǎn)載于:https://www.cnblogs.com/shuiyun/archive/2012/10/17/2728483.html

    總結(jié)

    以上是生活随笔為你收集整理的Android中解析XML---数据存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。