本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

--Comic Sans MS

Xml解析具有跨平台性,语言无关性,易操作性,因此广受开发者的欢迎。作为安卓开发者,至少有三种解析方式需要理解,Dom、Sax、Pull。

另外Java的四种解析XML的方法:http://developer.51cto.com/art/200903/117512.htm

1、首先讲一下dom解析

解析原理:将xml装入Dom树,依次根据Tag查到每个节点,然后取得结点里的对象属性。

以本地xml解析为例:

book.xml放到项目lib目录下

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="12">
<name>thinking in java</name>
<price>85.5</price>
</book>
<book id="15">
<name>Spring in Action</name>
<price>39.0</price>
</book>
</books>

操作逻辑:

public static void main(String[] args) throws Exception {
InputStream input = new FileInputStream("lib/book.xml");
List<Book> books = getBooks(input);
for (Book book : books) {
System.out.println(book.toString());
}
} public static List<Book> getBooks(InputStream inputStream) throws Exception {
List<Book> list = new ArrayList<Book>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//new一个factory来处理文件
DocumentBuilder builder = factory.newDocumentBuilder();//做一个处理框架
Document document = builder.parse(inputStream);// 把文件形成流的形式,放到一个doucument对象里
Element element = document.getDocumentElement();// 获得其中的元素集
NodeList bookNodes = element.getElementsByTagName("book");// 获得元素集下有一叫book的集合
for (int i = 0; i < bookNodes.getLength(); i++) {
Element bookElement = (Element) bookNodes.item(i);// 获取一个元素,然后设值
Book book = new Book();
book.setId(Integer.valueOf(bookElement.getAttribute("id")));
NodeList childNodes = bookElement.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) {
if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {// 结点
String type=childNodes.item(j).getNodeName();
String value = childNodes.item(j).getFirstChild()
.getNodeValue();
if ("name".equals(type)) {
book.setName(value);
} else if ("price".equals(type)) {
book.setPrice(Float.valueOf(value));
}
}
}// end for j
list.add(book);
}// end for i
return list;
}

2、

其次sax解析也相当常用

解析原理:将xml装入Sax解析工厂中,根据既定的模式可选择解析,使用的是标记事件驱动方式。

BookXmlHandler:

public class BookXMLHandler extends DefaultHandler {

	private List<Book> books;
private Book book;
private String tag; public List<Book> getBooks() {
// TODO Auto-generated method stub
return books;
} /*
* 文档开始时触发
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
books = new ArrayList<Book>();
} /*
* 元素开始时触发
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
tag = qName;
if ("book".equals(tag)) {
book = new Book();
book.setId(Integer.valueOf(attributes.getValue(0)));
}
} /*
* 读取元素内容
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if (tag == null) {
return;
}
String content = new String(ch, start, length);
if (content.trim().equalsIgnoreCase(null)
|| content.trim().equalsIgnoreCase("")) {
return;
}// 一定要记得trim
if ("name".equals(tag)) {
book.setName(content);
} else if ("price".equals(tag)) {
System.out.println(content);
book.setPrice(Float.valueOf(content));
}
} /*
* 元素结束时触发
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if ("book".equals(qName)) {
books.add(book);
book = null;
tag = null;
}
} /*
* 文档结束时触发
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}

操作逻辑:

	public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InputStream input = new FileInputStream("lib/book.xml");
List<Book> books = getBooks(input);
for (Book book : books) {
System.out.println(book.toString());
}
} private static List<Book> getBooks(InputStream input) throws Exception {
// TODO Auto-generated method stub
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
BookXMLHandler handler = new BookXMLHandler();
saxParser.parse(input, handler);
return handler.getBooks();
}

3、

第三种pull解析在安卓中是个特例

解析原理:它比Sax封装又高一个等级,是Sax的浓缩版,测试需要在Android环境下测。

测试逻辑:

public class PullParseTest extends AndroidTestCase {
public void testPull() throws Exception {
InputStream input = getContext().getAssets().open("book.xml");
List<Book> books = getBooks(input);
for (Book book : books) {
Log.i("AthrunTag", book.toString());
}
} public List<Book> getBooks(InputStream inputStream) throws Exception {
List<Book> books = null;
Book book = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
int event = parser.getEventType();// 产生第一个事件
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:// 判断当前事件是否是文档开始事件
books = new ArrayList<Book>();// 初始化books集合
break;
case XmlPullParser.START_TAG:// 判断当前事件是否是标签元素开始事件
if ("book".equals(parser.getName())) {// 判断开始标签元素是否是book
book = new Book();
book.setId(Integer.parseInt(parser.getAttributeValue(0)));// 得到book标签的属性值,并设置book的id
}
if (book != null) {
if ("name".equals(parser.getName())) {// 判断开始标签元素是否是name
book.setName(parser.nextText());
} else if ("price".equals(parser.getName())) {// 判断开始标签元素是否是price
book.setPrice(Float.parseFloat(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:// 判断当前事件是否是标签元素结束事件
if ("book".equals(parser.getName())) {// 判断结束标签元素是否是book
books.add(book);// 将book添加到books集合
book = null;
}
break;
}
event = parser.next();// 进入下一个元素并触发相应事件
}// end while
return books;
}
}

三种解析“真相”只有一个!

12:thinking in java:85.5
15:Spring in Action:39.0

3Q!

Android中级之网络数据解析一之xml解析的更多相关文章

  1. Android中获取网络数据时的分页加载

    //此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载,    蓝色部分是睡眠时间,自我感觉不用写  ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神 ...

  2. IOS 网络浅析-(五 xml解析)

    XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...

  3. WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据

    Webservice传递的数据只能是序列化的数据,典型的就是xml数据.   /// <summary>         /// 通过用户名和密码 返回下行数据         /// & ...

  4. [Android]天气App 3 网络数据的请求和Json解析

      Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...

  5. 网络HTTP、JSON、XML解析等 复习

    一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...

  6. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. 网络数据的XML解析

    网络应用中的数据解析,因为最近的应用,无论是Android的和ios平台的,一直用也是建议用的都是Json解析, xml解析都有点被遗忘了. 然后最近自己在做着玩一个ios的小应用,涉及网络数据的抓取 ...

  9. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. 树莓派最简易Wifi配置

    树莓派最简易Wifi配置 相信我,连博客都会偷懒写个最简易给你看 前提,只有一根网线没有网络的前提下进行的. 基于Win10系统和树莓派2015-05-05-raspbian-wheezy.img测试 ...

  2. 解决SQLite数据库中文乱码问题

      关于SQLite中出现中文乱码的分析以及解决方案 我们在使用SQLite数据库时候,可能会发现,向数据库插入数据时候显示的是汉字,但通过SQLite读出来时却显示的乱码,这是因为SQLite数据库 ...

  3. 从C中变化过来的各种语言的printf输出格式

    在c.php和shell中经常可以碰到printf的使用,特别是在php中printf的相关变种有好几个:print.printf.sprintf.vprintf.vsprintf     在这些语言 ...

  4. MyEclipse 中的各种有的没的快捷方式

    快捷键1 (CTRL) Ctrl+1 快速修复Ctrl+D: 删除当前行  Ctrl+Q  定位到最后编辑的地方  Ctrl+L  定位在某行   Ctrl+O  快速显示 OutLine  Ctrl ...

  5. VIM 技巧 (一)全文统一添加

    大家应该有遇到过给整篇内容增加同样的东西的经历.例如给每行结尾增加分号.冒号等内容. 今天和大家分享下 关于此场景如何快速.高效的实现. 例如 Line one Line two Line three ...

  6. Leetcode#89 Gray Code

    原题地址 二进制码 -> 格雷码:从最右边起,依次与左边相邻位异或,最左边一位不变.例如: 二进制: 1 0 0 1 1 1 0 |\|\|\|\|\|\| 格雷码: 1 1 0 1 0 0 1 ...

  7. map初始化定时器

    init_timer(); //各种定时器的初始化 void Map::init_timer() { //auto tf = GetPlug(TimerFactory); auto tf = m_sp ...

  8. ios设备突破微信小视频6S限制的方法

    刷微信朋友圈只发文字和图片怎能意犹未竟,微信小视频是一个很好的补充,音视频到位,流行流行最流行.但小视频时长不能超过6S,没有滤镜等是很大的遗憾.but有人突破限制玩出了花样,用ios设备在朋友圈晒出 ...

  9. [大牛翻译系列]Hadoop(5)MapReduce 排序:次排序(Secondary sort)

    4.2 排序(SORT) 在MapReduce中,排序的目的有两个: MapReduce可以通过排序将Map输出的键分组.然后每组键调用一次reduce. 在某些需要排序的特定场景中,用户可以将作业( ...

  10. STM32 对内部FLASH读写接口函数

    因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...