====================================================================================================================================
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 中
- InputStream stream =getAssets().open("books.xml");
- SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
- SaxParseXml parsexml=new SaxParseXml();
- parser.parse(stream,parsexml);
新建一个解析器对象 parser
实例化自己的处理器 parsexml
通过parser.parse(stream,parsexml) 实现用我们自己的处理器来解析xml
====================================================================================================================================
Dom 解析之初见:
根据资料可以知道Dom解析将booksxml文件加载进内存中再进行遍历xml节点获取数据。基本的步骤大致如下:
1, 创建一个 文档构造器
- DocumentBuilder documentbuider = DocumentBuilderFactory.newInstance().newDocumentBuilder();//用来获取 xml 数据流。
2, 将获得 xm l数据流赋值给Document 文档对象document。
- Document document = documentbuider.parse(stream);
3, 获取 xml 的 所有节点,并获取根节点
- Element element = document.getDocumentElement();
- NodeList booknodes = element.getElementsByTagName("book");
4, 遍历根节点,从每一个根节点中获得该根节点的所有子节点,再遍历该根节点的所有子节点,即两个嵌套循环。
- Element element = document.getDocumentElement();
- NodeList booknodes = element.getElementsByTagName("book");//获取所有根节点
- for(int i =0; i < booknodes.getLength(); i++){
- Element bookelement = (Element)booknodes.item(i);
- Book book = new Book();
- NodeList childnodes = bookelement.getChildNodes();//获取该根节点的所有子节点
- for(int j=0;j<childnodes.getLength();j++){
- if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){
- if("id".equals(childnodes.item(j).getNodeName())){
- book.id=childnodes.item(j).getFirstChild().getNodeValue();//获取数据
- }
- else if("name".equals(childnodes.item(j).getNodeName())){
- book.name=childnodes.item(j).getFirstChild().getNodeValue();
- }
- else if("price".equals(childnodes.item(j).getNodeName())){
- book.price=childnodes.item(j).getFirstChild().getNodeValue();
- }
- else if("publisher".equals(childnodes.item(j).getNodeName())){
- book.publisher=childnodes.item(j).getFirstChild().getNodeValue();
- }
- }
- }
- list.add(book);
- }
====================================================================================================================================
Pull 解析之初见:
在我查阅所有的资料中,有一句话最为贴切:
Pull解析与Sax解析很是接近,区别在于:Sax解析从进行到结束不受自己控制,属于把所有数据硬塞给你;Pull解析则不同,每解析一个book 都将需要手动 转到下一个解析事件,属于自己去要。
基本的步骤大致如下:
1, 创建一个 pull 解析器实例,并获取 xml 数据流,同时设置字符编码为 “UTF-8”
- XmlPullParser pullparse = XmlPullParserFactory.newInstance().newPullParser();
- pullparse.setInput(stream, "UTF-8");
2, 获得 pull 解析需要的事件类型,因为触发下一次xml解析需要自己手动进行
- int eventype = pullparse.getEventType();
3, 遍历每一个事件类型,进行相应的解析操作
- List<Book> books = null;
- Book book = null;
- while(XmlPullParser.END_DOCUMENT!=eventype){
- String str = pullparse.getName();
- switch (eventype) {
- case XmlPullParser.START_DOCUMENT:
- books = new ArrayList<Book>();
- break;
- case XmlPullParser.START_TAG:
- if(str.equals("book")){
- book = new Book();
- }
- else if(str.equals("id")){
- book.id=pullparse.nextText();
- }
- else if(str.equals("name")){
- book.name=pullparse.nextText();
- }
- else if(str.equals("price")){
- book.price=pullparse.nextText();
- }
- else if(str.equals("publisher")){
- book.publisher=pullparse.nextText();
- }
- break;
- case XmlPullParser.END_TAG:
- if(str.equals("book")&&book!=null){
- books.add(book);
- }
- break;
- default:
- break;
- }
- eventype = pullparse.next();
- }
====================================================================================================================================
具体代码实现如下:
目录结构:
第一步: Books.xml
- <?xml version="1.0" encoding="utf-8"?>
- <books>
- <book>
- <id>1001</id>
- <name>Thinking In Java</name>
- <price>80.00</price>
- <publisher>人民邮电出版社</publisher>
- </book>
- <book>
- <id>1002</id>
- <name>Python核心编程</name>
- <price>89.00</price>
- <publisher>宝哥出版社</publisher>
- </book>
- <book>
- <id>1003</id>
- <name>C++程序设计语言</name>
- <price>99.00</price>
- <publisher>机械工业出版社</publisher>
- </book>
- <book>
- <id>1004</id>
- <name>HTML5</name>
- <price>35.00</price>
- <publisher>Matt出版社</publisher>
- </book>
- <book>
- <id>1005</id>
- <name>JavaScript高级编程</name>
- <price>85.00</price>
- <publisher>清华大学出版社</publisher>
- </book>
- <book>
- <id>1006</id>
- <name>C++沉思录</name>
- <price>91.00</price>
- <publisher>苏州职业大学出版社</publisher>
- </book>
- </books>
activity_main.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:baselineAligned="false"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="2000"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:maxLines="22"
- android:scrollbars="vertical"
- android:text="@string/hello_world"
- tools:context=".MainActivity" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/bt_sax"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:text="@string/sax_parse" />
- <Button
- android:id="@+id/bt_dom"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:text="@string/dom_parse" />
- <Button
- android:id="@+id/bt_pull"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:text="@string/pull_parse" />
- </LinearLayout>
- </LinearLayout>
- package com.example.matt;
- public class Book {
- public String id;
- public String name;
- public String price;
- public String publisher;
- }
第三步:SaxParseXml.java
- package com.example.matt;
- import java.util.ArrayList;
- import java.util.List;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- public class SaxParseXml extends DefaultHandler {
- public List<Book> list;
- public Book book;
- public String str;
- public void startDocument() throws SAXException {
- list = new ArrayList<Book>();
- }
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- if (qName.equals("book")) {
- book = new Book();
- }
- this.str = qName;
- }
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- if (qName.equals("book")) {
- this.list.add(book);
- }
- this.str = null;
- }
- public void endDocument() throws SAXException {
- }
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- if (this.str != null) {
- String data = new String(ch, start, length);
- if (this.str.equals("id")) {
- this.book.id = data;
- } else if (this.str.equals("name")) {
- this.book.name = data;
- } else if (this.str.equals("price")) {
- this.book.price = data;
- } else if (this.str.equals("publisher")) {
- this.book.publisher = data;
- }
- }
- }
- }
第四步:DomParseXml.java
- package com.example.matt;
- import android.annotation.SuppressLint;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- @SuppressLint("ParserError")
- public class DomParseXml {
- @SuppressLint("ParserError")
- public List<Book>getbooks(InputStream stream) throws Exception{
- List<Book>list = new ArrayList<Book>();
- DocumentBuilder documentbuider = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- Document document = documentbuider.parse(stream);
- Element element = document.getDocumentElement();
- NodeList booknodes = element.getElementsByTagName("book");
- for(int i =0; i < booknodes.getLength(); i++){
- Element bookelement = (Element)booknodes.item(i);
- Book book = new Book();
- NodeList childnodes = bookelement.getChildNodes();
- for(int j=0;j<childnodes.getLength();j++){
- if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){
- if("id".equals(childnodes.item(j).getNodeName())){
- book.id=childnodes.item(j).getFirstChild().getNodeValue();
- }
- else if("name".equals(childnodes.item(j).getNodeName())){
- book.name=childnodes.item(j).getFirstChild().getNodeValue();
- }
- else if("price".equals(childnodes.item(j).getNodeName())){
- book.price=childnodes.item(j).getFirstChild().getNodeValue();
- }
- else if("publisher".equals(childnodes.item(j).getNodeName())){
- book.publisher=childnodes.item(j).getFirstChild().getNodeValue();
- }
- }
- }
- list.add(book);
- }
- stream.close();
- return list;
- }
- }
- package com.example.matt;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserFactory;
- public class PullParseXml {
- public List<Book>getbooks(InputStream stream) throws Exception{
- XmlPullParser pullparse = XmlPullParserFactory.newInstance().newPullParser();
- pullparse.setInput(stream, "UTF-8");
- int eventype = pullparse.getEventType();
- List<Book> books = null;
- Book book = null;
- while(XmlPullParser.END_DOCUMENT!=eventype){
- String str = pullparse.getName();
- switch (eventype) {
- case XmlPullParser.START_DOCUMENT:
- books = new ArrayList<Book>();
- break;
- case XmlPullParser.START_TAG:
- if(str.equals("book")){
- book = new Book();
- }
- else if(str.equals("id")){
- book.id=pullparse.nextText();
- }
- else if(str.equals("name")){
- book.name=pullparse.nextText();
- }
- else if(str.equals("price")){
- book.price=pullparse.nextText();
- }
- else if(str.equals("publisher")){
- book.publisher=pullparse.nextText();
- }
- break;
- case XmlPullParser.END_TAG:
- if(str.equals("book")&&book!=null){
- books.add(book);
- }
- break;
- default:
- break;
- }
- eventype = pullparse.next();
- }
- stream.close();
- return books;
- }
- }
第六步:MainActivity.java
- package com.example.matt;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.List;
- import javax.xml.parsers.FactoryConfigurationError;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.SAXException;
- import android.os.Bundle;
- import android.app.Activity;
- import android.text.method.ScrollingMovementMethod;
- import android.view.KeyEvent;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- public int back_count = 1;
- public Button bt_sax;
- public Button bt_dom;
- public Button bt_pull;
- public InputStream stream;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- back_count = 1;
- bt_sax = (Button) findViewById(R.id.bt_sax);
- bt_dom = (Button) findViewById(R.id.bt_dom);
- bt_pull = (Button) findViewById(R.id.bt_pull);
- bt_sax.setOnClickListener(bt_listener);
- bt_dom.setOnClickListener(bt_listener);
- bt_pull.setOnClickListener(bt_listener);
- }
- public OnClickListener bt_listener = new OnClickListener() {
- public void onClick(View v) {
- TextView text = (TextView) findViewById(R.id.text);
- text.setMovementMethod(ScrollingMovementMethod.getInstance());
- List<Book> books=null;
- try {
- stream = getAssets().open("books.xml");
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- switch (v.getId()) {
- case R.id.bt_sax:
- try {
- SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
- SaxParseXml saxparse = new SaxParseXml();
- parser.parse(stream, saxparse);
- stream.close();
- books = saxparse.list;
- String str = "";
- for (Book book : books) {
- str += ">>>id:" + book.id + "\n>>>name:" + book.name
- + "\n>>>price:" + book.price + "\n>>>publisher:"
- + book.publisher + "\n\n";
- }
- text.setText("Sax解析:\n"+str);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ParserConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SAXException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (FactoryConfigurationError e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- break;
- case R.id.bt_dom:
- DomParseXml domparse = new DomParseXml();
- try {
- books = domparse.getbooks(stream);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String str = "";
- for (Book book : books) {
- str += "---id:" + book.id + "\n---name:" + book.name
- + "\n---price:" + book.price + "\n---publisher:"
- + book.publisher + "\n\n";
- }
- text.setText("Dom解析:\n"+str);
- break;
- case R.id.bt_pull:
- PullParseXml pullparse = new PullParseXml();
- try {
- books = pullparse.getbooks(stream);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String booklist = "";
- for (Book book : books) {
- booklist += "***id:" + book.id + "\n***name:" + book.name
- + "\n***price:" + book.price + "\n***publisher:"
- + book.publisher + "\n\n";
- }
- text.setText("Pull解析:\n"+booklist);
- break;
- }
- }
- };
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if (back_count == 1) {
- Toast.makeText(this, "再按一次退出", 2000).show();
- back_count++;
- } else if (back_count == 2) {
- finish();
- }
- return true;
- } else {
- return super.onKeyDown(keyCode, event);
- }
- }
- }
That's all .
转载请注明出处!http://blog.csdn.net/mkrcpp/article/details/7761546