XML解析
安卓有三种xml解析器,SAX(Simple API Xml),DoM(Document Object Xml),以及Android推荐的Pull。
SAX
是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。缺点是只适合做文档的读取,不适合做文档的增删改查
DOM
即对象文档模型,基于树形结构,递归遍历节点。它通常载入整个XML,以及树形结构到内存,所以查找更新数据效率高,但对大文档小内存的场景时,效果不好。
优点对文档增删改查比较方便,缺点占用内存比较大
PULL
原理与SAX相似,比SAX灵活,比DOM占内存小。官方推荐API
PullBookParser.java代码如下:
- packagecom.scott.xml.parser;
-
- importjava.io.InputStream;
- importjava.io.StringWriter;
- importjava.util.ArrayList;
- importjava.util.List;
-
- importorg.xmlpull.v1.XmlPullParser;
- importorg.xmlpull.v1.XmlSerializer;
- importandroid.util.Xml;
- importcom.scott.xml.model.Book;
- publicclassPullBookParserimplementsBookParser{
- @Override
- publicList<Book>parse(InputStreamis)throwsException{
- List<Book>books=null;
- Bookbook=null;
- XmlPullParserparser=Xml.newPullParser();
- parser.setInput(is,"UTF-8");
- inteventType=parser.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- switch(eventType){
- caseXmlPullParser.START_DOCUMENT:
- books=newArrayList<Book>();
- break;
- caseXmlPullParser.START_TAG:
- if(parser.getName().equals("book")){
- book=newBook();
- }elseif(parser.getName().equals("id")){
- eventType=parser.next();
- book.setId(Integer.parseInt(parser.getText()));
- }if(parser.getName().equals("name")){
- eventType=parser.next();
- book.setName(parser.getText());
- if(parser.getName().equals("price")){
- book.setPrice(Float.parseFloat(parser.getText()));
- }
- caseXmlPullParser.END_TAG:
- books.add(book);
- book=returnbooks;
- @Override
- publicStringserialize(List<Book>books)throwsException{
- XmlSerializerserializer=Xml.newSerializer();
- StringWriterwriter=newStringWriter();
- serializer.setOutput(writer);
- serializer.startDocument("UTF-8",true);
- serializer.startTag("","books");
- for(Bookbook:books){
- "book");
- serializer.attribute("","id",book.getId()+"");
- serializer.startTag("","name");
- serializer.text(book.getName());
- serializer.endTag("","price");
- serializer.text(book.getPrice()+"");
- "book");
- }
- "books");
- serializer.endDocument();
- returnwriter.toString();
- }
然后再对MainActivity做以下更改:
copy
readBtn.setOnClickListener(newView.OnClickListener(){
- voidonClick(Viewv){
- try{
- InputStreamis=getAssets().open("books.xml");
- parser=newPullBookParser();
- books=parser.parse(is);
- Log.i(TAG,book.toString());
- catch(Exceptione){
- Log.e(TAG,e.getMessage());
- });
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|