一:第一种DOM解析:
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
}
public void btn(View view){
List<Book> bookList = domResolver();
tv.setText(bookList.toString());
}
/**
* dom解析xml文档
*/
public List<Book> domResolver(){
try {
//step1: 获取dom解析器工厂实例
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
//step2 : 使用工厂实例创建一个dom解析器
DocumentBuilder db = df.newDocumentBuilder();
//step3 : 开始解析xml
//判断一下sdcard是否存在
File f = null;
if(sdcardIsExist())
f = new File(Environment.getExternalStorageDirectory(), "Books.xml");
//开始解析xml文档
Document document = db.parse(f);
//获取一个Book标签
NodeList nodeList = document.getElementsByTagName("Book");
//StringBuffer sb = new StringBuffer();
//创建一个集合
List<Book> list = new ArrayList<Book>();
//遍历nodeList集合
for (int i = 0; i < nodeList.getLength(); i++) {
Book book = new Book();
Element element = (Element) nodeList.item(i);
String name = element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
String price = element.getElementsByTagName("price").item(0).getFirstChild().getNodeValue();
String author = element.getElementsByTagName("author").item(0).getFirstChild().getNodeValue();
book.setName(name);
book.setPrice(price);
book.setAuthor(author);
list.add(book);
//sb.append("姓名 : "+name+"\t价格 : "+price+"\t作者 : "+author+"\n");
}
//Toast.makeText(this, sb.toString(), 1).show();
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 检测sdcard是否存在
*
* @return
*/
private boolean sdcardIsExist() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
} else {
return false;
}
}
}
二:第二种Sax解析:
1):先继承一个Sax类:
public class SaxHandler extends DefaultHandler {
private List<Book> bookList;
private Book book;
//定义一个标记,记住刚才那个标签名字
private String preType = null;
public List<Book> getBookList(InputStream is,SaxHandler saxHandler){
try {
//1.创建一个sax解析工程实例
SAXParserFactory sf = SAXParserFactory.newInstance();
//2.创建一个sax解析器
SAXParser parser = sf.newSAXParser();
//3.开始解析xml文档
parser.parse(is, saxHandler);
} catch (Exception e) {
e.printStackTrace();
}
return bookList;
}
@Override
public void startDocument() throws SAXException {
//开始解析document节点
super.startDocument();
//在开解析文档的时候,把这个集合初始化
bookList = new ArrayList<Book>();
}
@Override
public void endDocument() throws SAXException {
//读取xml文档结束时回调的方法
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//解析开始标签会执行的方法
//uri 命名空间 (不用管)
//localName 本地名称 (不用管)
//qName 这个是标签/元素/节点名字
super.startElement(uri, localName, qName, attributes);
if("Book".equals(qName)){
book = new Book();
}
//记住标签名字
preType = qName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
//读到结束标签会调用的方法
if("Book".equals(qName)){
bookList.add(book);
}
preType = null;
super.endElement(uri, localName, qName);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//解析文本会执行的方法
String content = new String(ch, start, length);
//判断是哪一个标签的文本
if("name".equals(preType)){
book.setName(content);
}else if("price".equals(preType)){
book.setPrice(content);
}else if("author".equals(preType)){
book.setAuthor(content);
}
super.characters(ch, start, length);
}
}
2):随后调用:
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
}
public void btn(View view){
try {
SaxHandler saxHandler = new SaxHandler();
InputStream is = getAssets().open("Books.xml");
List<Book> bookList = saxHandler.getBookList(is, saxHandler);
tv.setText(bookList.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
三:第三种PULL解析:
public class MainActivity extends Activity implements OnClickListener {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
findViewById(R.id.btn).setOnClickListener(this);
findViewById(R.id.btn1).setOnClickListener(this);
tv = (TextView) findViewById(R.id.tv);
}
/**
* 使用android内置pull解析器进行解析
*/
private List<Book> pullResolver() {
try {
// 创建一个pull解析器实例
XmlPullParser parser = Xml.newPullParser();
// 设置这个文件以什么样的编码格式输入到内存中
InputStream is = getAssets().open("Books.xml");
parser.setInput(is, "utf-8");
// 开始解析xml文档
int type = parser.getEventType();
// 逐行扫描xml,如果parser解析到这个事件!= END_DOCUMENT
// 创建一个集合
List<Book> bookList = null;
// 创建一个javaBean
Book book = null;
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("Books".equals(parser.getName())) {
bookList = new ArrayList<Book>();
} else if ("Book".equals(parser.getName())) {
book = new Book();
} else if ("name".equals(parser.getName())) {
// 获取这个标签里面的值
// parser.getAttributeName(0);获取Book标签中的某一个属性
String name = parser.nextText();
book.setName(name);
} else if ("price".equals(parser.getName())) {
String price = parser.nextText();
book.setPrice(price);
} else if ("author".equals(parser.getName())) {
String author = parser.nextText();
book.setAuthor(author);
}
break;
case XmlPullParser.END_TAG:// 结束标签
if ("Book".equals(parser.getName())) {
// 将javaBean存到这个集合里
bookList.add(book);
}
break;
}
// 往下移动一行 这一行千万不漏掉了
type = parser.next();
}
return bookList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将书本信息用一个xml保存起来
*
*/
private boolean saveBookToXml(List<Book> list){
try {
//创建一个序列化器实例
XmlSerializer serializer = Xml.newSerializer();
//设置这个数据以什么样的编码格式输出
File file = new File(Environment.getExternalStorageDirectory(), "Book2.xml");
OutputStream os = new FileOutputStream(file);
serializer.setOutput(os, "utf-8");
//<?xml version="1.0" encoding="UTF-8"?> 开始写入文档声明
serializer.startDocument("utf-8", false);
//设置缩进模式
//开始写一个标签
serializer.startTag("", "Books");
for (Book book : list) {
serializer.startTag("", "Book");
//serializer.setProperty("id", "1");
serializer.startTag("", "name");
serializer.text(book.getName());
serializer.endTag("", "name");
serializer.startTag("", "price");
serializer.text(book.getPrice());
serializer.endTag("", "price");
serializer.startTag("", "author");
serializer.text(book.getAuthor());
serializer.endTag("", "author");
serializer.endTag("", "Book");
}
serializer.endTag("", "Books");
//文档写入完毕
serializer.endDocument();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn: {
List<Book> books = pullResolver();
// 为了演示,我就toString了
tv.setText(books.toString());
}
break;
case R.id.btn1:
{
boolean result = saveBookToXml(pullResolver());
if(result){
Toast.makeText(this, "写入成功", 1).show();
}else{
Toast.makeText(this, "写入失败", 1).show();
}
}
break;
}
}
}