android中的xml解析方式小结
来源:互联网 发布:网络十二主神 编辑:程序博客网 时间:2024/06/03 11:04
本文参考学习了:
http://blog.csdn.net/liuhe688/article/details/6415593/
我这里主要考虑实战性,只学习pull方式,给出一些需要注意的地方!!!
通常Android下xml解析方式有三种:
1、sax解析
2、pull解析
3、dom解析
sax和pull都是基于事件驱动的,区别就是sax事件是系统指定的,
pull是程序员代码启动的。
dom是以树状结构进行解析,确定就是文件非常大,一下子加载在内存ram里面,太损耗内存了,卡死。
android推荐使用pull解析,自带解析器。所以个人认识把pull解析搞懂就可以了,当然,你有时间也可以学习其他两种模式!!!别学我偷懒啊
demo:
在工程的根目录下创建/assets/books.xml文件,内容:
<?xml version="1.0" encoding="UTF-8"?><books> <book year="2001" type="java技术" > <id> 1001 </id> <name> Thinking In Java </name> <price> 80.00 </price> </book> <book year="2002" type="java技术" > <id> 1002 </id> <name> Core Java </name> <price> 90.00 </price> </book> <book year="2003" type="android技术" > <id> 1003 </id> <name> Hello, Andriod </name> <price> 100.00 </price> </book> <book year="2004" type="文学" > <id>1004</id> <name>西游记</name> <price>150.00</price> </book> <book year="2005" type="禁书" > <id> 1005 </id> <name> 金瓶梅 </name> <price> 200.00 </price> </book></books>
对这个xml文件进行解析,之后再把解析出来的内容写到
data/data/应用包名/files/book2.xml中
对这个xml进行分析,抽象出一个
book.java
package com.example.pull_dom_parser;public class Book { /* * <id> 1001 </id> <name> Thinking In Java </name> <price> 80.00 </price> */ private String yearString, type, id, name, price; public Book() { super(); } public Book(String yearString, String type, String id, String name, String price) { super(); this.yearString = yearString; this.type = type; this.id = id; this.name = name; this.price = price; } public String getYearString() { return yearString; } public void setYearString(String yearString) { this.yearString = yearString; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } @Override public String toString() { return "Book [yearString=" + yearString + ", type=" + type + ", id=" + id + ", name=" + name + ", price=" + price + "]"; }}
为了实现pull\dom\sax三种模式的扩展,可以定义接口
BookParser.java:
/** * */package com.example.pull_dom_parser;import java.io.InputStream;import java.io.OutputStream;import java.util.List;/** * @author lihui20 * */public interface BookParser { // 读取 public List<Book> readFromXML(InputStream inputStream); // 写入 String writeToXML(List<Book> list);}
后面可以根据不同的方式实现这个接口,重写接口方法。
这里我使用pull方式:
PullBookParse .java
package com.example.pull_dom_parser;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.StringWriter;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.util.Log;import android.util.Xml;public class PullBookParse implements BookParser { @Override public List<Book> readFromXML(InputStream inputStream) { // TODO Auto-generated method stub XmlPullParser xmlPullParser = Xml.newPullParser(); List<Book> books = null; Book book = null; try { xmlPullParser.setInput(inputStream, "UTF-8"); int eventType = xmlPullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: // 一次 books = new ArrayList<Book>(); break; case XmlPullParser.START_TAG: if (xmlPullParser.getName().equals("book")) { book = new Book(); // year type book.setYearString(xmlPullParser.getAttributeValue(0)); book.setType(xmlPullParser.getAttributeValue(1)); } else if (xmlPullParser.getName().equals("id")) { book.setId(xmlPullParser.nextText()); } else if (xmlPullParser.getName().equals("name")) { book.setName(xmlPullParser.nextText()); } else if (xmlPullParser.getName().equals("price")) { book.setPrice(xmlPullParser.nextText()); } break; case XmlPullParser.END_TAG: if (xmlPullParser.getName().equals("book")) { books.add(book); } break; case XmlPullParser.END_DOCUMENT: break; default: break; } // next下一个事件 eventType = xmlPullParser.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return books; } @Override public String writeToXML(List<Book> list) { // TODO Auto-generated method stub // 能读取,就可以写到xml里面 // 定义头标签 XmlSerializer xmlSerializer = Xml.newSerializer(); StringWriter stringWriter = new StringWriter(); String namespace = ""; try { xmlSerializer.setOutput(stringWriter); xmlSerializer.startDocument("UTF-8", true); xmlSerializer.startTag(namespace, "books"); for (Book book : list) { xmlSerializer.startTag(namespace, "book"); xmlSerializer .attribute(namespace, "year", book.getYearString()); xmlSerializer.attribute(namespace, "type", book.getType()); // xmlSerializer.startTag(namespace, "id"); xmlSerializer.text(book.getId()); xmlSerializer.endTag(namespace, "id"); // xmlSerializer.startTag(namespace, "name"); xmlSerializer.text(book.getName()); xmlSerializer.endTag(namespace, "name"); // xmlSerializer.startTag(namespace, "price"); xmlSerializer.text(book.getPrice()); xmlSerializer.endTag(namespace, "price"); // xmlSerializer.endTag(namespace, "book"); } xmlSerializer.endTag("", "books"); xmlSerializer.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("test1448", "stringWriter.toString()---" + stringWriter.toString()); // 开始写xml,标签、内容 return stringWriter.toString(); }}
注解:
这里用到了stringbuffer,这个流不是把内容写到文件、xml、txt、数据库等里面的,是把文字写到RAM内存里的,临时存放。用于后续输出到book2.xml中。
pull解析主要是事件驱动
int eventType = xmlPullParser.getEventType();
事件类型:
1、解析文档开始事件
2、遇到开始标签事件
<xxxx>
3、遇到结束事件
</xxxx>
4、解析文档结束事件
文本类型
文本类型2个:
1、标签文本
<xxx></xxx>
这里的xxx就是标签文本
2、text内容文本
就是除了标签文本外出现的文字
hello<xxx>12312213</xxx>world
hello
12312213
world
这些是text文本
好了,工具写好了。
在activity中调用吧。
package com.example.pull_dom_parser;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.util.List;import android.app.Activity;import android.content.Context;import android.content.res.AssetManager;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener { Button readButton, writeButton; TextView showText; Context mContext; private List<Book> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView(); } private void initView() { // TODO Auto-generated method stub readButton = (Button) findViewById(R.id.button1); writeButton = (Button) findViewById(R.id.button2); showText = (TextView) findViewById(R.id.textView1); readButton.setOnClickListener(this); writeButton.setOnClickListener(this); } @SuppressWarnings("resource") @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: PullBookParse pullBookParse = new PullBookParse(); AssetManager assetManager = getResources().getAssets(); InputStream inputStream = null; try { inputStream = assetManager.open("books.xml"); list = pullBookParse.readFromXML(inputStream); StringBuffer stringBuffer = new StringBuffer(); for (Book book : list) { stringBuffer.append(book.toString() + "\r\n"); } showText.setText("从xml中读取内容:\r\n" + stringBuffer.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } break; case R.id.button2: // data/data/包名 下生成一个文件,把读取的内容写进去 PullBookParse bookParser = new PullBookParse(); File xmlFile = new File(getFilesDir().getAbsoluteFile(), "books2.xml"); String xmlString = bookParser.writeToXML(list); Log.d("xmlString", "xmlString---" + xmlString); // OutputStream out = null; try { // out = new FileOutputStream(xmlFile); FileOutputStream out = this.openFileOutput("books3.xml", MODE_PRIVATE); BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter(out)); bufferedWriter.write(xmlString); bufferedWriter.flush(); out.close(); bufferedWriter.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case R.id.textView1: break; default: break; } }}
layout.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.pull_dom_parser.MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="读取xml" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_toRightOf="@+id/button1" android:text="写入xml" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_below="@+id/button1" android:text="TextView" /></RelativeLayout>
注解:
在每个目录下,一般有这么几个子目录经常使用到:
databases : 存放数据库
cache : 存放缓存数据
files : 存放应用程序自己控制的文件
lib : 存放使用的包
每个应用程序的代码,对自己的目录是有绝对的控制权限的。
我们使用了files目录。
获取可以使用:
FileOutputStream out = this.openFileOutput(“books3.xml”,
MODE_PRIVATE);
或者:
File xmlFile = new File(getFilesDir().getAbsoluteFile(),
“books2.xml”);
当用输出流bufferwriter需要
bufferedWriter.flush();之后,
out.close();
bufferedWriter.close();
否则无法写到文件中。
必须flush刷新一下!!!!
好了,android pull解析读取xml、写入xml,就这样吧~~~~
- android中的xml解析方式小结
- Android中的三种XML解析方式
- Android中的三种XML解析方式
- Android中的SAX方式解析XML
- Android中的三种XML解析方式
- Android XML解析方式
- java解析XML几种方式小结
- java解析XML几种方式小结
- java解析XML几种方式小结
- ANDROID 中的xml解析
- 解析Android中的XML
- Android中的XML解析
- Android Pull方式解析XML
- android dom 解析xml方式
- android sax解析 xml方式
- android pull 解析xml方式
- android pull 解析xml方式
- android解析xml(SIX方式)
- MsiGetFileVersion函数不知道为什么折腾了好久还是不成功-原来是检测exe文件不是msi文件
- C# 反射
- 7、jQuery插件之uploadify文件上传(基于flash)
- stylus之插值(Interpolation)
- linux手工创建Oracle实例操作说明
- android中的xml解析方式小结
- JS中的prototype
- echarts 横向条状图
- mysql 达到1亿级别的表如何设计优化
- 使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)
- Palindrome Number
- 小米手机安装应用报 Installation failed with message Failed to establish session
- Metrics vs Statistics
- 一个JAVA程序员成长之路分享