XML的三种原生解析方式
DOM,SAX,PULL
DOM:内存消耗大 但是便于遍历.打开文档,将其转化为节点树,然后在其用循环的方式,遍历节点,一一查找.
SAX:速度快,战内存少.但是文件结构信息会丢失,采用的是流的处理方式.从起始标签开始一一往下逐个查找.起始标签与结尾标签作为标记来将一组数据存入一个集合中,想水流一样一直到最尾,然后最后返回集合,集合中就存下了所有的数据(这也应该就是所谓的流处理方式吧).
PULL:是Android内置,推荐的一种,相对来说有点类似SAX,也是从上往下,但是它还是已文档开始与结尾为条件,在其中间进行查找处理,然后分为不同标签开始逐一查找.
JSON:轻量级的数据交换格式,比XML小,解析速度快,而且方便,(大括号对象,中括号方法,冒号属性,直接解析,很简单粗暴啊),通过json文件,得到其中的JSON对象与数组,还有对象中的属性,对应的解析的时候json对象中的数据是已key-values的形式存在的,非常好理解.
以简单的PULL代码示例
PULL
package com.example.again;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import com.example.again.bean.Book;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;
import android.view.MenuItem;
public class PullXmlActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_xml);
List<Book>list = pullXmlDate();
for (Book book : list) {
Log.e("--main--", "Pull"+book.toString());
}
}
private List<Book> pullXmlDate(){
List<Book>list = null;
InputStream inputStream = null;
try {
inputStream = getAssets().open("books.xml");
Book book = null;
//获取解析器
XmlPullParser parser = Xml.newPullParser();
//设置输入流和编码格式
parser.setInput(inputStream, "UTF-8");
//获取读取状态
int type = parser.getEventType();
//不等于文档结束
while(type != XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_DOCUMENT://文档开始
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG://开始标签
switch (parser.getName()) {
case "book":
book = new Book();
//获取属性值 参数代表属性下标
book.setDescription(parser.getAttributeName(0));
break;
case "id":
book.setId(Integer.valueOf(parser.nextText()));
break;
case "name":
book.setName(parser.nextText());
break;
case "price":
book.setPrice(Double.valueOf(parser.nextText()));
break;
default:
break;
}
break;
case XmlPullParser.END_TAG://标签结束
if(parser.getName().equals("book")){
list.add(book);
}
default:
break;
}
//把当前状态返回给type
type = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(inputStream!=null){
inputStream.close();
inputStream = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
}
book:
package com.example.again.bean;
/**
* @author zq
*
*/
public class Book {
private String description;
private int id;
private String name;
private double price;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book [description=" + description + ", id=" + id + ", name=" + name + ", price=" + price
+ "]";
}
}
BOOK.xml:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book description="是基础中的基础,必须牢固掌握">
<id>1001</id>
<name>Java基础教程</name>
<price>80.00</price>
</book>
<book description="学好Android第一步">
<id>1002</id>
<name>Android基础教程</name>
<price>90.00</price>
</book>
<book description="走向高级程序员必经之路">
<id>1003</id>
<name>Android高级教程</name>
<price>100.00</price>
</book>
</books>