【Android基础入门〖16〗】XML解析

来源:互联网 发布:键盘弹钢琴软件 编辑:程序博客网 时间:2024/05/16 12:02

====================================================================================================================================

Sax 解析之初见:

1,准备一个books.xml 内容可以在下文看到,我的目的就是解析它并在屏幕上打印出来。

2,新建一个book 类 ,其属性 (id,name,price,publisher)  与 books.xml 里面的的标签  (id,name,price,publisher)  相一致。为了简单容易理解的获取books.xml里面的数据。           当然,并不是必须的,只是为了赋值方便,通俗易懂。

3,实现一个处理器 class SaxParseXml extends DefaultHandler  。

      a, 在 DefaultHandler 中重写了 startDocument ,用于开始解析 books.xml,可以在此新建一个List<Book>,以便获取各个book对象数据。 

      b, 在 startElement     中开始解析 books.xml中 的元素 ,例如,每次 解析到 id 或者 name 时 都会触发一次 characters 进行解析,在characters 中 将获得数据 赋值给 book               类,从而得到数据,

      c, endElement 结束一个元素(标签)的解析,将book对象加入List<Book>。

      d, 在endDocument 中结束对 books.xml的解析。

4,在MainActivity 中 

  1. InputStream stream =getAssets().open("books.xml");  
  2. SAXParser parser=SAXParserFactory.newInstance().newSAXParser();  
  3. SaxParseXml parsexml=new SaxParseXml();  
  4. parser.parse(stream,parsexml);  
读取books.xml进入 输入流对象 stream

新建一个解析器对象 parser 

实例化自己的处理器 parsexml

通过parser.parse(stream,parsexml) 实现用我们自己的处理器来解析xml

====================================================================================================================================

Dom 解析之初见:

根据资料可以知道Dom解析将booksxml文件加载进内存中再进行遍历xml节点获取数据。基本的步骤大致如下:

1,  创建一个 文档构造器 

  1. DocumentBuilder documentbuider = DocumentBuilderFactory.newInstance().newDocumentBuilder();//用来获取 xml 数据流。  


2, 将获得 xm l数据流赋值给Document 文档对象document。

  1. Document document = documentbuider.parse(stream);  

3, 获取 xml 的 所有节点,并获取根节点

  1. Element element = document.getDocumentElement();   
  2. NodeList booknodes = element.getElementsByTagName("book");  

4,    遍历根节点,从每一个根节点中获得该根节点的所有子节点,再遍历该根节点的所有子节点,即两个嵌套循环。

  1. Element element = document.getDocumentElement();  
  2. NodeList booknodes = element.getElementsByTagName("book");//获取所有根节点  
  3.   
  4. for(int i =0; i < booknodes.getLength(); i++){  
  5.       
  6.     Element bookelement = (Element)booknodes.item(i);  
  7.     Book book = new Book();  
  8.       
  9.     NodeList childnodes = bookelement.getChildNodes();//获取该根节点的所有子节点  
  10.     for(int j=0;j<childnodes.getLength();j++){  
  11.         if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){  
  12.             if("id".equals(childnodes.item(j).getNodeName())){  
  13.                 book.id=childnodes.item(j).getFirstChild().getNodeValue();//获取数据  
  14.             }  
  15.             else if("name".equals(childnodes.item(j).getNodeName())){  
  16.                 book.name=childnodes.item(j).getFirstChild().getNodeValue();  
  17.             }  
  18.             else if("price".equals(childnodes.item(j).getNodeName())){  
  19.                 book.price=childnodes.item(j).getFirstChild().getNodeValue();  
  20.             }  
  21.             else if("publisher".equals(childnodes.item(j).getNodeName())){  
  22.                 book.publisher=childnodes.item(j).getFirstChild().getNodeValue();  
  23.             }                     
  24.         }  
  25.     }  
  26.     list.add(book);  
  27. }  

====================================================================================================================================

Pull 解析之初见:

在我查阅所有的资料中,有一句话最为贴切:

Pull解析与Sax解析很是接近,区别在于:Sax解析从进行到结束不受自己控制,属于把所有数据硬塞给你;Pull解析则不同,每解析一个book 都将需要手动 转到下一个解析事件,属于自己去要。

基本的步骤大致如下:

1,  创建一个 pull 解析器实例,并获取 xml 数据流,同时设置字符编码为 “UTF-8”

  1. XmlPullParser pullparse = XmlPullParserFactory.newInstance().newPullParser();  
  2.             pullparse.setInput(stream, "UTF-8");  

2,  获得 pull 解析需要的事件类型,因为触发下一次xml解析需要自己手动进行

  1. int eventype = pullparse.getEventType();  

3,  遍历每一个事件类型,进行相应的解析操作

  1. List<Book> books = null;  
  2. Book book = null;  
  3.               
  4. while(XmlPullParser.END_DOCUMENT!=eventype){  
  5.                   
  6.                 String str = pullparse.getName();  
  7.                 switch (eventype) {  
  8.                 case XmlPullParser.START_DOCUMENT:  
  9.                     books = new ArrayList<Book>();  
  10.                     break;  
  11.                       
  12.                 case XmlPullParser.START_TAG:    
  13.                     if(str.equals("book")){    
  14.                         book = new Book();    
  15.                     }  
  16.                     else if(str.equals("id")){    
  17.                         book.id=pullparse.nextText();    
  18.                     }  
  19.                     else if(str.equals("name")){    
  20.                         book.name=pullparse.nextText();    
  21.                     }    
  22.                     else if(str.equals("price")){    
  23.                         book.price=pullparse.nextText();    
  24.                     }    
  25.                     else if(str.equals("publisher")){    
  26.                         book.publisher=pullparse.nextText();    
  27.                     }  
  28.                     break;    
  29.                     
  30.                 case XmlPullParser.END_TAG:    
  31.                     if(str.equals("book")&&book!=null){    
  32.                         books.add(book);    
  33.                     }                          
  34.                     break;   
  35.                 default:  
  36.                     break;  
  37.                 }  
  38.                 eventype = pullparse.next();                  
  39.             }             

====================================================================================================================================

具体代码实现如下:


目录结构:



第一步: Books.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <books>  
  3.     <book>  
  4.         <id>1001</id>  
  5.         <name>Thinking In Java</name>  
  6.         <price>80.00</price>  
  7.         <publisher>人民邮电出版社</publisher>  
  8.     </book>  
  9.     <book>  
  10.         <id>1002</id>  
  11.         <name>Python核心编程</name>  
  12.         <price>89.00</price>  
  13.         <publisher>宝哥出版社</publisher>  
  14.     </book>  
  15.     <book>  
  16.         <id>1003</id>  
  17.         <name>C++程序设计语言</name>  
  18.         <price>99.00</price>  
  19.         <publisher>机械工业出版社</publisher>  
  20.     </book>  
  21.     <book>  
  22.         <id>1004</id>  
  23.         <name>HTML5</name>  
  24.         <price>35.00</price>  
  25.         <publisher>Matt出版社</publisher>  
  26.     </book>  
  27.     <book>  
  28.         <id>1005</id>  
  29.         <name>JavaScript高级编程</name>  
  30.         <price>85.00</price>  
  31.         <publisher>清华大学出版社</publisher>  
  32.     </book>  
  33.         <book>  
  34.         <id>1006</id>  
  35.         <name>C++沉思录</name>  
  36.         <price>91.00</price>  
  37.         <publisher>苏州职业大学出版社</publisher>  
  38.     </book>  
  39. </books>  

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:baselineAligned="false"  
  6.     android:orientation="vertical" >  
  7.     <LinearLayout  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_weight="2000"  
  11.         android:orientation="vertical" >  
  12.         <TextView  
  13.             android:id="@+id/text"  
  14.             android:layout_width="fill_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:maxLines="22"  
  17.             android:scrollbars="vertical"  
  18.             android:text="@string/hello_world"  
  19.             tools:context=".MainActivity" />  
  20.     </LinearLayout>  
  21.   
  22.   
  23.     <LinearLayout  
  24.         android:layout_width="fill_parent"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_weight="1"  
  27.         android:orientation="horizontal" >  
  28.         <Button  
  29.             android:id="@+id/bt_sax"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="fill_parent"  
  32.             android:layout_weight="1"  
  33.             android:text="@string/sax_parse" />  
  34.         <Button  
  35.             android:id="@+id/bt_dom"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="fill_parent"  
  38.             android:layout_weight="1"  
  39.             android:text="@string/dom_parse" />  
  40.         <Button  
  41.             android:id="@+id/bt_pull"  
  42.             android:layout_width="wrap_content"  
  43.             android:layout_height="fill_parent"  
  44.             android:layout_weight="1"  
  45.             android:text="@string/pull_parse" />  
  46.     </LinearLayout>  
  47. </LinearLayout>  


第二步:Book.java

  1. package com.example.matt;  
  2.   
  3. public class Book {  
  4.     public String id;  
  5.     public String name;  
  6.     public String price;  
  7.     public String publisher;  
  8.   
  9. }  

第三步:SaxParseXml.java

  1. package com.example.matt;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.xml.sax.Attributes;  
  6. import org.xml.sax.SAXException;  
  7. import org.xml.sax.helpers.DefaultHandler;  
  8.   
  9. public class SaxParseXml extends DefaultHandler {  
  10.   
  11.     public List<Book> list;  
  12.     public Book book;  
  13.     public String str;  
  14.   
  15.     public void startDocument() throws SAXException {  
  16.         list = new ArrayList<Book>();  
  17.   
  18.     }  
  19.   
  20.     public void startElement(String uri, String localName, String qName,  
  21.             Attributes attributes) throws SAXException {  
  22.         if (qName.equals("book")) {  
  23.             book = new Book();  
  24.         }  
  25.         this.str = qName;  
  26.   
  27.     }  
  28.   
  29.     public void endElement(String uri, String localName, String qName)  
  30.             throws SAXException {  
  31.         if (qName.equals("book")) {  
  32.             this.list.add(book);  
  33.         }  
  34.         this.str = null;  
  35.     }  
  36.   
  37.     public void endDocument() throws SAXException {  
  38.   
  39.     }  
  40.   
  41.     public void characters(char[] ch, int start, int length)  
  42.             throws SAXException {  
  43.   
  44.         if (this.str != null) {  
  45.             String data = new String(ch, start, length);  
  46.             if (this.str.equals("id")) {  
  47.                 this.book.id = data;  
  48.             } else if (this.str.equals("name")) {  
  49.                 this.book.name = data;  
  50.             } else if (this.str.equals("price")) {  
  51.                 this.book.price = data;  
  52.             } else if (this.str.equals("publisher")) {  
  53.                 this.book.publisher = data;  
  54.             }  
  55.   
  56.         }  
  57.   
  58.     }  
  59.   
  60. }  


第四步:DomParseXml.java

  1. package com.example.matt;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import java.io.InputStream;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. import javax.xml.parsers.DocumentBuilder;  
  9. import javax.xml.parsers.DocumentBuilderFactory;  
  10.   
  11. import org.w3c.dom.Document;  
  12. import org.w3c.dom.Element;  
  13. import org.w3c.dom.Node;  
  14. import org.w3c.dom.NodeList;  
  15.   
  16. @SuppressLint("ParserError")  
  17. public class DomParseXml {  
  18.   
  19.     @SuppressLint("ParserError")  
  20.     public List<Book>getbooks(InputStream stream) throws Exception{  
  21.         List<Book>list = new ArrayList<Book>();  
  22.         DocumentBuilder documentbuider = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
  23.         Document document = documentbuider.parse(stream);  
  24.           
  25.         Element element = document.getDocumentElement();  
  26.           
  27.         NodeList booknodes = element.getElementsByTagName("book");  
  28.           
  29.         for(int i =0; i < booknodes.getLength(); i++){  
  30.               
  31.             Element bookelement = (Element)booknodes.item(i);  
  32.             Book book = new Book();  
  33.               
  34.             NodeList childnodes = bookelement.getChildNodes();  
  35.             for(int j=0;j<childnodes.getLength();j++){  
  36.                 if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){  
  37.                     if("id".equals(childnodes.item(j).getNodeName())){  
  38.                         book.id=childnodes.item(j).getFirstChild().getNodeValue();  
  39.                     }  
  40.                     else if("name".equals(childnodes.item(j).getNodeName())){  
  41.                         book.name=childnodes.item(j).getFirstChild().getNodeValue();  
  42.                     }  
  43.                     else if("price".equals(childnodes.item(j).getNodeName())){  
  44.                         book.price=childnodes.item(j).getFirstChild().getNodeValue();  
  45.                     }  
  46.                     else if("publisher".equals(childnodes.item(j).getNodeName())){  
  47.                         book.publisher=childnodes.item(j).getFirstChild().getNodeValue();  
  48.                     }                     
  49.                 }  
  50.             }  
  51.             list.add(book);  
  52.         }  
  53.         stream.close();  
  54.         return list;  
  55.           
  56.     }  
  57.   
  58. }  


第五步:PullParseXml.java
  1. package com.example.matt;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import org.xmlpull.v1.XmlPullParser;  
  7. import org.xmlpull.v1.XmlPullParserFactory;  
  8.   
  9. public class PullParseXml {  
  10.   
  11.         public List<Book>getbooks(InputStream stream) throws Exception{  
  12.               
  13.             XmlPullParser pullparse = XmlPullParserFactory.newInstance().newPullParser();  
  14.             pullparse.setInput(stream, "UTF-8");  
  15.               
  16.             int eventype = pullparse.getEventType();  
  17.             List<Book> books = null;  
  18.             Book book = null;  
  19.               
  20.             while(XmlPullParser.END_DOCUMENT!=eventype){  
  21.                   
  22.                 String str = pullparse.getName();  
  23.                 switch (eventype) {  
  24.                 case XmlPullParser.START_DOCUMENT:  
  25.                     books = new ArrayList<Book>();  
  26.                     break;  
  27.                       
  28.                 case XmlPullParser.START_TAG:    
  29.                     if(str.equals("book")){    
  30.                         book = new Book();    
  31.                     }  
  32.                     else if(str.equals("id")){    
  33.                         book.id=pullparse.nextText();    
  34.                     }  
  35.                     else if(str.equals("name")){    
  36.                         book.name=pullparse.nextText();    
  37.                     }    
  38.                     else if(str.equals("price")){    
  39.                         book.price=pullparse.nextText();    
  40.                     }    
  41.                     else if(str.equals("publisher")){    
  42.                         book.publisher=pullparse.nextText();    
  43.                     }  
  44.                     break;    
  45.                     
  46.                 case XmlPullParser.END_TAG:    
  47.                     if(str.equals("book")&&book!=null){    
  48.                         books.add(book);    
  49.                     }                          
  50.                     break;   
  51.                 default:  
  52.                     break;  
  53.                 }  
  54.                 eventype = pullparse.next();                  
  55.             }             
  56.             stream.close();  
  57.             return books;  
  58.         }  
  59. }  

第六步:MainActivity.java

  1. package com.example.matt;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.List;  
  6. import javax.xml.parsers.FactoryConfigurationError;  
  7. import javax.xml.parsers.ParserConfigurationException;  
  8. import javax.xml.parsers.SAXParser;  
  9. import javax.xml.parsers.SAXParserFactory;  
  10. import org.xml.sax.SAXException;  
  11. import android.os.Bundle;  
  12. import android.app.Activity;  
  13. import android.text.method.ScrollingMovementMethod;  
  14. import android.view.KeyEvent;  
  15. import android.view.Menu;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21.   
  22. public class MainActivity extends Activity {  
  23.     public int back_count = 1;  
  24.     public Button bt_sax;  
  25.     public Button bt_dom;  
  26.     public Button bt_pull;  
  27.     public InputStream stream;  
  28.   
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         back_count = 1;  
  33.   
  34.         bt_sax = (Button) findViewById(R.id.bt_sax);  
  35.         bt_dom = (Button) findViewById(R.id.bt_dom);  
  36.         bt_pull = (Button) findViewById(R.id.bt_pull);  
  37.           
  38.         bt_sax.setOnClickListener(bt_listener);  
  39.         bt_dom.setOnClickListener(bt_listener);  
  40.         bt_pull.setOnClickListener(bt_listener);  
  41.   
  42.     }  
  43.   
  44.     public OnClickListener bt_listener = new OnClickListener() {  
  45.         public void onClick(View v) {  
  46.             TextView text = (TextView) findViewById(R.id.text);  
  47.             text.setMovementMethod(ScrollingMovementMethod.getInstance());  
  48.             List<Book> books=null;  
  49.   
  50.             try {  
  51.                 stream = getAssets().open("books.xml");  
  52.             } catch (IOException e1) {  
  53.                 e1.printStackTrace();  
  54.             }  
  55.               
  56.             switch (v.getId()) {  
  57.             case R.id.bt_sax:  
  58.                 try {  
  59.   
  60.                     SAXParser parser = SAXParserFactory.newInstance().newSAXParser();  
  61.                     SaxParseXml saxparse = new SaxParseXml();  
  62.                     parser.parse(stream, saxparse);  
  63.                     stream.close();  
  64.                     books = saxparse.list;  
  65.                     String str = "";  
  66.                     for (Book book : books) {  
  67.                         str += ">>>id:" + book.id + "\n>>>name:" + book.name  
  68.                                 + "\n>>>price:" + book.price + "\n>>>publisher:"  
  69.                                 + book.publisher + "\n\n";  
  70.                     }  
  71.                     text.setText("Sax解析:\n"+str);  
  72.   
  73.                 } catch (IOException e) {  
  74.                     // TODO Auto-generated catch block  
  75.                     e.printStackTrace();  
  76.                 } catch (ParserConfigurationException e) {  
  77.                     // TODO Auto-generated catch block  
  78.                     e.printStackTrace();  
  79.                 } catch (SAXException e) {  
  80.                     // TODO Auto-generated catch block  
  81.                     e.printStackTrace();  
  82.                 } catch (FactoryConfigurationError e) {  
  83.                     // TODO Auto-generated catch block  
  84.                     e.printStackTrace();  
  85.                 }  
  86.                 break;  
  87.                   
  88.             case R.id.bt_dom:  
  89.                 DomParseXml domparse = new DomParseXml();  
  90.                 try {  
  91.                     books = domparse.getbooks(stream);  
  92.                 } catch (Exception e) {  
  93.                     // TODO Auto-generated catch block  
  94.                     e.printStackTrace();  
  95.                 }  
  96.                 String str = "";  
  97.                 for (Book book : books) {  
  98.                     str += "---id:" + book.id + "\n---name:" + book.name  
  99.                             + "\n---price:" + book.price + "\n---publisher:"  
  100.                             + book.publisher + "\n\n";  
  101.   
  102.                 }  
  103.                 text.setText("Dom解析:\n"+str);  
  104.                 break;  
  105.                   
  106.             case R.id.bt_pull:  
  107.                 PullParseXml pullparse = new PullParseXml();  
  108.                 try {  
  109.                     books = pullparse.getbooks(stream);  
  110.                 } catch (Exception e) {  
  111.                     // TODO Auto-generated catch block  
  112.                     e.printStackTrace();  
  113.                 }  
  114.                 String booklist = "";  
  115.                 for (Book book : books) {  
  116.                     booklist += "***id:" + book.id + "\n***name:" + book.name  
  117.                             + "\n***price:" + book.price + "\n***publisher:"  
  118.                             + book.publisher + "\n\n";  
  119.   
  120.                 }  
  121.                 text.setText("Pull解析:\n"+booklist);  
  122.                 break;  
  123.             }  
  124.   
  125.         }  
  126.   
  127.     };  
  128.   
  129.     public boolean onCreateOptionsMenu(Menu menu) {  
  130.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  131.         return true;  
  132.     }  
  133.   
  134. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  135.   
  136.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  137.   
  138.             if (back_count == 1) {  
  139.                 Toast.makeText(this"再按一次退出"2000).show();  
  140.                 back_count++;  
  141.             } else if (back_count == 2) {  
  142.                 finish();  
  143.   
  144.             }  
  145.   
  146.             return true;  
  147.         } else {  
  148.             return super.onKeyDown(keyCode, event);  
  149.         }  
  150.     }  
  151.   
  152. }  



运行效果:




That's all .

转载请注明出处!http://blog.csdn.net/mkrcpp/article/details/7761546