简单介绍

在Android开发中,关于XML解析有三种方式,各自是:

  • SAX 基于事件的解析器。解析速度快。占用内存少。非常适合在Android移动设备中使用。

  • DOM 在内存中以树形结构存放,因此检索和更新效率会更高。可是对于特别大的文档,解析和载入整个文档将会非常耗资源

  • PULL 基于事件的解析器。不同于SAX是,PULL是主动请求下一个事件,所以在可控上PULL要比SAX有用。

    Android系统内部在解析各种XML时也是用PULL解析器。

以下实现各种解析的类以及project结构

这是我们将要解析的XML文件id.xml以及其相应的Book

<?

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>

Book.java

public class Book {

    public static final String BOOKS = "books";
public static final String BOOK = "book";
public static final String ID = "id";
public static final String NAME = "name";
public static final String PRICE = "price"; 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;
}
}

以下是XML解析类的实现

抽象类用于 XML文件读写的继承

XMLParseFactory.java

import java.io.InputStream;
import java.util.List; public abstract class XMLParseFactory { /**
* 读取指定的XML文件
* @param inputStream XML文件输入流
*/
public abstract void readXML(InputStream inputStream); /**
* 保存XML到指定的文件
* @param filePath 文件的绝对路径
*/
public abstract void writeXML(String filePath); /**
* 获取Book对象列表
* @return
*/
public abstract List<Book> getBookList(); /**
* 设置Book对象列表
*/
public abstract void setBookList(List<Book> bookList);
}

用SAX实现的方法

SAXParserTool.java

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
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.TransformerConfigurationException;
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; public class SAXParserTool extends XMLParseFactory { // private static final String TAG = "SAXParserTool"; private SAXHandler mHandler = new SAXHandler(); private List<Book> mBookList; @Override
public void readXML(InputStream inputStream) { try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(inputStream, mHandler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} @Override
public void writeXML(String filePath) {
SAXTransformerFactory factory = (SAXTransformerFactory) TransformerFactory.newInstance();
try {
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"); FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter writer = new OutputStreamWriter(fos);
Result result = new StreamResult(writer);
handler.setResult(result); String uri = "";
String localName = ""; handler.startDocument();
handler.startElement(uri, localName, Book.BOOKS, null);
AttributesImpl attrs = new AttributesImpl();
char[] ch = null; for (Book book:mBookList) {
attrs.clear();
attrs.addAttribute(uri, localName, Book.ID, "string", String.valueOf(book.getId()));
handler.startElement(uri, localName, Book.BOOK, attrs); handler.startElement(uri, localName, Book.NAME, null);
ch = book.getName().toCharArray();
handler.characters(ch, 0, ch.length);
handler.endElement(uri, localName, Book.NAME); handler.startElement(uri, localName, Book.PRICE, null);
ch = String.valueOf(book.getPrice()).toCharArray();
handler.characters(ch, 0, ch.length);
handler.endElement(uri, localName, Book.PRICE); handler.endElement(uri, localName, Book.BOOK);
} handler.endElement(uri, localName, Book.BOOKS);
handler.endDocument(); } catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 获取BookList列表
* @return
*/
public List<Book> getBookList() {
if (mHandler == null) {
return null;
} return mHandler.getBookList();
} /**
* 设置BookList列表
* @param bookList
*/
public void setBookList(List<Book> bookList) {
mBookList = bookList;
} class SAXHandler extends DefaultHandler { private List<Book> mBookList;
private Book mBook;
private String mTargetName; public List<Book> getBookList() {
return mBookList;
} @Override
public void startDocument() throws SAXException {
super.startDocument();
mBookList = new ArrayList<Book>();
} @Override
public void endDocument() throws SAXException {
super.endDocument();
} @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)) {
mBook = new Book();
mBook.setId(Integer.valueOf(attributes.getValue(Book.ID)));
} mTargetName = localName;
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (Book.BOOK.equals(localName)) {
mBookList.add(mBook);
} mTargetName = null;
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if (Book.NAME.equals(mTargetName)) {
mBook.setName(new String(ch, start, length));
} else if (Book.PRICE.equals(mTargetName)) {
mBook.setPrice(Float.valueOf(new String(ch, start, length)));
}
}
}
}

用PULL实现的方法

PULLParserTool.java

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer; import android.util.Xml; public class PULLParserTool extends XMLParseFactory { // private static final String TAG = "PULLParserTool";
private List<Book> mBookList;
private Book mBook; @Override
public void readXML(InputStream inputStream) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8"); int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String name = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
mBookList = new ArrayList<Book>();
break; case XmlPullParser.START_TAG:
// Log.d(TAG, "getName:"+parser.getName()+","+parser.getText());
if (Book.BOOK.equals(name)) {
mBook = new Book();
mBook.setId(Integer.valueOf(parser.getAttributeValue("", Book.ID)));
} else if (Book.NAME.equals(name)) {
mBook.setName(parser.nextText());
} else if (Book.PRICE.equals(name)) {
mBook.setPrice(Float.valueOf(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if (Book.BOOK.equals(name)) {
mBookList.add(mBook);
}
break; default:
break;
} eventType = parser.next();
} } catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } @Override
public void writeXML(String filePath) {
XmlSerializer serializer = Xml.newSerializer();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath);
serializer.setOutput(fos, "UTF-8"); serializer.startDocument("UTF-8", true);
serializer.startTag("", Book.BOOKS); for (Book book:mBookList) {
serializer.startTag("", Book.BOOK);
serializer.attribute("", Book.ID, book.getId()+""); serializer.startTag("", Book.NAME);
serializer.text(book.getName());
serializer.endTag("", Book.NAME); serializer.startTag("", Book.PRICE);
serializer.text(String.valueOf(book.getPrice()));
serializer.endTag("", Book.PRICE); serializer.endTag("", Book.BOOK);
} serializer.endTag("", Book.BOOKS);
serializer.endDocument(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} public List<Book> getBookList() {
return mBookList;
} public void setBookList(List<Book> bookList) {
mBookList = bookList;
}
}

用DOM实现的方法

DOMParserTool.java

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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 org.xml.sax.SAXException; import android.util.Log; public class DOMParserTool extends XMLParseFactory { private static final String TAG = "DOMParserTool";
private List<Book> mBookList; @Override
public void readXML(InputStream inputStream) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document parse = builder.parse(inputStream);
Element root = parse.getDocumentElement();
NodeList nodeList = root.getElementsByTagName(Book.BOOK); mBookList = new ArrayList<Book>();
Log.d(TAG,"length:"+nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
Book book = new Book();
Element item = (Element) nodeList.item(i);
book.setId(Integer.valueOf(item.getAttribute(Book.ID)));
NodeList nodes = item.getChildNodes(); for (int j = 0; j < nodes.getLength(); j++) {
Node node = nodes.item(j);
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (Book.NAME.equals(node.getNodeName())) {
String content = node.getTextContent();
book.setName(content);
} else if (Book.PRICE.equals(node.getNodeName())) {
String content = node.getTextContent();
book.setPrice(Float.valueOf(content));
}
}
Log.d(TAG, "readXML:"+node.getLocalName()+","+node.getNodeName()
+","+node.getNodeType()+","+node.getNodeValue()
+","+node.getTextContent()
+","+node.toString());
} mBookList.add(book);
} } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} @Override
public void writeXML(String filePath) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element rootElement = document.createElement("books"); for (Book book:mBookList) {
Element bookElement = document.createElement("book");
bookElement.setAttribute(Book.ID, book.getId()+""); Element nameElement = document.createElement(Book.NAME);
nameElement.setTextContent(book.getName());
bookElement.appendChild(nameElement); Element priceElement = document.createElement(Book.PRICE);
priceElement.setTextContent(String.valueOf(book.getPrice()));
bookElement.appendChild(priceElement); rootElement.appendChild(bookElement);
} document.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");// 是否忽略XML声明 FileOutputStream fos = new FileOutputStream(filePath);
Source source = new DOMSource(document);
Result result = new StreamResult(fos);
transformer.transform(source, result); } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
} public List<Book> getBookList() {
return mBookList;
} public void setBookList(List<Book> bookList) {
mBookList = bookList;
} }

这是调用各种解析类的实现

MainActivity.java


import java.io.IOException;
import java.io.InputStream;
import java.util.List; import com.example.xmlparsedemo.xmlparser.Book;
import com.example.xmlparsedemo.xmlparser.DOMParserTool;
import com.example.xmlparsedemo.xmlparser.PULLParserTool;
import com.example.xmlparsedemo.xmlparser.SAXParserTool;
import com.example.xmlparsedemo.xmlparser.XMLParseFactory; import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { private TextView mText;
private XMLParseFactory parseFactory; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); init();
} private void init() {
Button saxReadBtn = (Button) findViewById(R.id.id_saxread);
Button saxWriteBtn = (Button) findViewById(R.id.id_saxwrite);
Button domReadBtn = (Button) findViewById(R.id.id_domread);
Button domWriteBtn = (Button) findViewById(R.id.id_domwrite);
Button pullReadBtn = (Button) findViewById(R.id.id_pullread);
Button pullWriteBtn = (Button) findViewById(R.id.id_pullwrite);
mText = (TextView) findViewById(R.id.id_text); saxReadBtn.setOnClickListener(this);
saxWriteBtn.setOnClickListener(this);
domReadBtn.setOnClickListener(this);
domWriteBtn.setOnClickListener(this);
pullReadBtn.setOnClickListener(this);
pullWriteBtn.setOnClickListener(this);
} @Override
public void onClick(View v) {
InputStream inputStream;
try {
inputStream = getAssets().open("id.xml"); switch (v.getId()) {
case R.id.id_saxread:
parseFactory = new SAXParserTool();
parseFactory.readXML(inputStream);
showBookList(parseFactory.getBookList());
break;
case R.id.id_saxwrite:
parseFactory.setBookList(parseFactory.getBookList());
parseFactory.writeXML(Environment.getExternalStorageDirectory().getPath()+"/id.xml");
break;
case R.id.id_domread:
parseFactory = new DOMParserTool();
parseFactory.readXML(inputStream);
showBookList(parseFactory.getBookList());
break;
case R.id.id_domwrite:
parseFactory.writeXML(Environment.getExternalStorageDirectory().getPath()+"/id2.xml");
break;
case R.id.id_pullread:
parseFactory = new PULLParserTool();
parseFactory.readXML(inputStream);
showBookList(parseFactory.getBookList());
break;
case R.id.id_pullwrite:
parseFactory.writeXML(Environment.getExternalStorageDirectory().getPath()+"/id3.xml");
break; default:
break;
}
} catch (IOException e1) {
e1.printStackTrace();
} } private void showBookList(List<Book> bookList) {
StringBuilder builder = new StringBuilder();
for (Book book:bookList) {
builder.append(book.toString());
builder.append("\n");
} mText.setText(builder.toString());
}
}

解析实现的主布局

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <Button
android:id="@+id/id_saxread"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SAXParserRead" /> <Button
android:id="@+id/id_saxwrite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SAXParserWrite" /> <Button
android:id="@+id/id_domread"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="DOMParserRead" /> <Button
android:id="@+id/id_domwrite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="DOMParserWrite" /> <Button
android:id="@+id/id_pullread"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="PULLParserRead" /> <Button
android:id="@+id/id_pullwrite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="PULLParserWrite" /> <TextView
android:id="@+id/id_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </ScrollView>

效果图

參考文章

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

http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html

http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html

Android中XML解析,保存的三种方法的更多相关文章

  1. Android中设置文本颜色的三种方法

    最近刚开始学web,发现好的颜色搭配可以让自己的网页更加美观, 中午不想做事,就无聊滴花了两个小时测试了所有颜色的编码,总结如下 新手没有什么吊炸天的技术,仅仅是一份辅助的文档,有兴趣的朋友可以收藏下 ...

  2. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

  3. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  4. Android中XML解析

    package com.example.thebroadproject; public class Book { private int id; private String name; privat ...

  5. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  6. Android开发之去掉标题栏的三种方法,推荐第三种

    Android:去掉标题栏的三种方法和全屏的三种方法 第一种:一般入门的时候常常使用的一种方法 onCreate函数中增加下面代码: requestWindowFeature(Window.FEATU ...

  7. (六)C#中判断空字符串的三种方法性能分析

    三种方法分别是: string a=""; 1.if(a=="") 2.if(a==string.Empty) 3.if(a.Length==0) 三种方法是等 ...

  8. Java中实现线程同步的三种方法

    实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...

  9. Android中XML解析-PULL解析

    前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...

随机推荐

  1. Python中的traceback模块

    traceback模块被用来跟踪异常返回信息. 如下例所示: 1.直接打印异常信息 import traceback try: raise SyntaxError, "traceback t ...

  2. [源码管理] Windows下搭建SVN服务器

    前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效 ...

  3. 不用任何插件,实现一个tab栏切换

    //使用jquery中获取当前索引的方法.显示隐藏 <script> $(".tab_list li").on('click', function () { $(thi ...

  4. 实现第三方登录(QQ、微信、微博)

    第三方登录,就是使用大家比较熟悉的比如QQ.微信.微博等第三方软件登录自己的网站,这可以免去注册账号.快速留住用户的目的,免去了相对复杂的注册流程.下边就给大家讲一下怎么使用PHP开发QQ登录的功能. ...

  5. BZOJ 2729 高精度+组合数学

    思路: 考虑 把男生排成一排 女生和老师往里插 分成两种情况. 1. 女生中间夹着老师 2. 女生中间没有夹着老师 求一下组合* 阶乘就好了 先放Python代码 简洁易懂 def fact(n): ...

  6. jbox如果弹不出,放在body里

    body> <form id="form1" runat="server"> <script type="text/javas ...

  7. JqGrid saveRow方法报404错误

    TCX_1807工艺配置/检测项配置页面为jqgrid可编辑页面,使用的脚本为 ){ jQuery('#gridList').saveRow(lastId, true);//保存上一个修改的单元行 } ...

  8. JUC集合-BlockingQueue

    BlockingQueue 阻塞队列,支持两个附加操作. 1,在队列为空时,获取元素的线程会等待对列变为非空. 2,在队列为满时,存储元素的线程会等待对列可用. 使用场景: 生产者往对列里添加元素 消 ...

  9. DataTable的Select()方法

    DataRow[] partno = dtPack.Select("PK_SOHEAD = " + pk_sohead + " AND PART_NO = '" ...

  10. sqoop从DB2迁移数据到HDFS

    Sqoop import job failed to read data from DB2 database which has UTF8 encoding. Essentially, even th ...