Android中级之网络数据解析一之xml解析
本文来自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解析的更多相关文章
- Android中获取网络数据时的分页加载
//此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载, 蓝色部分是睡眠时间,自我感觉不用写 ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神 ...
- IOS 网络浅析-(五 xml解析)
XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...
- WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据
Webservice传递的数据只能是序列化的数据,典型的就是xml数据. /// <summary> /// 通过用户名和密码 返回下行数据 /// & ...
- [Android]天气App 3 网络数据的请求和Json解析
Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...
- 网络HTTP、JSON、XML解析等 复习
一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 网络数据的XML解析
网络应用中的数据解析,因为最近的应用,无论是Android的和ios平台的,一直用也是建议用的都是Json解析, xml解析都有点被遗忘了. 然后最近自己在做着玩一个ios的小应用,涉及网络数据的抓取 ...
- Android系列之网络(二)----HTTP请求头与响应头
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
随机推荐
- 16位CPU多周期设计
16位CPU多周期设计 这个工程完成了16位CPU的多周期设计,模块化设计,有包含必要的分析说明. 多周期CPU结构图 多周期CPU设计真值表 对应某一指令的情况,但仅当对应周期时才为对应的输出,不是 ...
- DebugViewHierarchy
DebugViewHierarchy(视图调试)是XCode6新出的一项功能,它可以让开发者在程序运行时,动态的查看当前界面的显示情况,包括视图的层次,控件的大小和位置,而且会以3D效果显示当前视图的 ...
- word2007中如何隐藏工具栏
1.对于屏幕较小的用户来说,编辑时可能需要隐藏word上方的工具栏,具体操作如下:
- 水王ID
题目: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你 ...
- hope is a good thing!
好久没有写博客了,在这么特殊的日子里,似乎不写点东西感觉总是少了点什么.其实从昨天开始就在努力的回忆,回忆自己这个2014年都做了些什么?自己收获了些什么?突然就觉得去年的那个暑假是那么的熟悉,怎么又 ...
- WEB实时聊天 comet推技术
转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...
- Careercup - Google面试题 - 5424071030341632
2014-05-08 22:55 题目链接 原题: Given a list of strings. Produce a list of the longest common suffixes. If ...
- asp.net中父子页面通过gridview中的按钮事件进行回传值的问题
这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来: 问题描述: 父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会 ...
- Django RequestContext用法
模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把user放到context中. from d ...
- 【BZOJ】【1202】【HNOI2005】狡猾的商人
Orz iwtwiioi http://www.cnblogs.com/iwtwiioi/p/3887617.html 并查集+前缀和 啊……这题应该是水题吧?但是我这个大沙茶居然一天都没想出来…… ...