生活随笔
收集整理的這篇文章主要介紹了
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?{?? ????? ? ? ? ? ?? ????public ?List<Book>?parse(InputStream?is)? 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();???? ????????SAXParser?parser?=?factory.newSAXParser();???????????????????? ????????MyHandler?handler?=?new ?MyHandler();???????????????????????? ?? ????????parser.parse(is ,?handler);?????????????????????????????????? ?? ????????return ?handler.getBooks();?? ????}?? ?? ????@Override?? ????public ?String?serialize(List<Book>?books)?throws?Exception?{?? ????????SAXTransformerFactory?factory?=?(SAXTransformerFactory)?TransformerFactory.newInstance();?? ????????TransformerHandler?handler?=?factory.newTransformerHandler();????????????? ????????Transformer?transformer?=?handler.getTransformer();??????????????????????? ????????transformer.setOutputProperty(OutputKeys.ENCODING,?"UTF-8" );???????????? ?? ????????transformer.setOutputProperty(OutputKeys.INDENT,?"yes" );???????????????? ?? ????????transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,?"no" );??? ?? ?????????? ????????StringWriter?writer?=?new ?StringWriter();?? ????????Result?result?=?new ?StreamResult(writer);?? ????????handler.setResult(result);?? ?????????? ????????String?uri?=?"" ;???? ?? ????????String?localName?=?"" ;?? ?? ?????????? ????????handler.startDocument();?? ????????handler.startElement(uri,?localName,?"books" ,? null );?? ?????????? ????????AttributesImpl?attrs?=?new ?AttributesImpl();???? ?? ????????char []?ch?=? null ;?? ????????for ?(Book?book?:?books)?{?? ????????????attrs.clear();???? ????????????attrs.addAttribute(uri,?localName,?"id" ,? "string" ,?String.valueOf(book.getId())); ?? ????????????handler.startElement(uri,?localName,?"book" ,?attrs);???? ?? ?????????????? ????????????handler.startElement(uri,?localName,?"name" ,? null );? ?? ????????????ch?=?String.valueOf(book.getName()).toCharArray();?? ????????????handler.characters(ch,?0,?ch.length);????? ????????????handler.endElement(uri,?localName,?"name" );?? ?????????????? ????????????handler.startElement(uri,?localName,?"price" ,? null ); ?? ????????????ch?=?String.valueOf(book.getPrice()).toCharArray();?? ????????????handler.characters(ch,?0,?ch.length);????? ????????????handler.endElement(uri,?localName,?"price" );?? ?????????????? ????????????handler.endElement(uri,?localName,?"book" );?? ????????}?? ????????handler.endElement(uri,?localName,?"books" );?? ????????handler.endDocument();?? ?????????? ????????return ?writer.toString();?? ????}?? ?????? ?????? ????private ? class ?MyHandler?extends?DefaultHandler?{?? ?? ????????private ?List<Book>?books;?? ????????private ?Book?book;?? ????????private ?StringBuilder?builder;?? ?????????? ?????????? ????????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);????? ????????}?? ?????????? ????????@Override?? ????????public ? void ?characters( char []?ch,? int ?start,? int ?length)?throws?SAXException?{?? ????????????super.characters(ch,?start,?length);?? ????????????builder.append(ch,?start,?length);???? ????????}?? ?????????? ????????@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();?? ?? ????????????????????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();???? ????????DocumentBuilder?builder?=?factory.newDocumentBuilder();??? ????????Document?doc?=?builder.parse(is);????? ????????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();????? ?????????? ????????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();?? ????????Transformer?transformer?=?transFactory.newTransformer();?????? ????????transformer.setOutputProperty(OutputKeys.ENCODING,?"UTF-8" );???????????? ?? ????????transformer.setOutputProperty(OutputKeys.INDENT,?"yes" );???????????????? ?? ????????transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,?"no" );??? ?? ?????????? ????????StringWriter?writer?=?new ?StringWriter();?? ?????????? ????????Source?source?=?new ?DOMSource(doc);? ?? ????????Result?result?=?new ?StreamResult(writer); ?? ????????transformer.transform(source,?result);???? ?????????? ????????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 ?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 ;?? ?????????? ?? ?? ?????????? ????????XmlPullParser?parser?=?Xml.newPullParser();??? ????????parser.setInput(is,?"UTF-8" );??????????????? ?? ?? ????????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?{?? ?? ?? ?????????? ????????XmlSerializer?serializer?=?Xml.newSerializer();??? ????????StringWriter?writer?=?new ?StringWriter();?? ????????serializer.setOutput(writer);????? ????????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 ?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ò),歡迎將生活随笔 推薦給好友。