在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢?

通常有三种方式:DOM,SAX,PULL

在这一节中我们使用DOM方式来处理。

DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理效率方面就相对差了,当然这是对于其他方式处理xml文档而言。

解析xml文档,当然必须有xml文档文件啦,我自己胡乱弄了一个river,放在assets目录.如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rivers>
  3. <river name="灵渠" length="605">
  4. <introduction>
  5. 灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。
  6. </introduction>
  7. <imageurl>
  8. http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
  9. </imageurl>
  10. </river>
  11.  
  12. <river name="胶莱运河" length="200">
  13. <introduction>
  14. 胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。胶莱运河自平度姚家村东的分水岭南北分流。南流由麻湾口入胶州湾,为南胶莱河,长30公里。北流由海仓口入莱州湾,为北胶莱河,长100余公里。
  15. </introduction>
  16. <imageurl>
  17. http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
  18. </imageurl>
  19. </river>
  20.  
  21. <river name="苏北灌溉总渠" length="168">
  22. <introduction>
  23. 位于淮河下游江苏省北部,西起洪泽湖边的高良涧,流经洪泽,青浦、淮安,阜宁、射阳,滨海等六县(区),东至扁担港口入海的大型人工河道。全长168km。
  24. </introduction>
  25. <imageurl>
  26. http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg
  27. </imageurl>
  28. </river>
  29. </rivers>

  

那么如何处理呢?

具体思路是:

*首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
*然后利用DocumentBuilderFactory创建DocumentBuilder

*然后加载XML文档(Document),
* 然后获取文档的根结点(Element),
* 然后获取根结点中所有子节点的列表(NodeList),
* 然后使用再获取子节点列表中的需要读取的结点。

当然我们观察节点,我需要用一个River对象来保存数据,抽象出River类

  1. public class River implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. private String name;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public int getLength() {
  11. return length;
  12. }
  13. public void setLength(int length) {
  14. this.length = length;
  15. }
  16. public String getIntroduction() {
  17. return introduction;
  18. }
  19. public void setIntroduction(String introduction) {
  20. this.introduction = introduction;
  21. }
  22. public String getImageurl() {
  23. return imageurl;
  24. }
  25. public void setImageurl(String imageurl) {
  26. this.imageurl = imageurl;
  27. }
  28. private int length;
  29. private String introduction;
  30. private String imageurl;
  31. }

  

下面我们就开始读取xml文档对象,并添加进List中:代码如下:

我们这里是使用assets中的river.xml文件,那么就需要读取这个xml文件,返回输入流。

读取方法为:inputStream=this.context.getResources().getAssets().open(fileName);   参数是xml文件路径,当然默认的是assets目录为根目录。

然后可以用DocumentBuilder对象的parse方法解析输入流,并返回document对象,然后再遍历doument对象的节点属性。

  1. //获取全部河流数据
  2. /**
  3. * 参数fileName:为xml文档路径
  4. */
  5. public List<River> getRiversFromXml(String fileName){
  6. List<River> rivers=new ArrayList<River>();
  7. DocumentBuilderFactory factory=null;
  8. DocumentBuilder builder=null;
  9. Document document=null;
  10. InputStream inputStream=null;
  11. //首先找到xml文件
  12. factory=DocumentBuilderFactory.newInstance();
  13. try {
  14. //找到xml,并加载文档
  15. builder=factory.newDocumentBuilder();
  16. inputStream=this.context.getResources().getAssets().open(fileName);
  17. document=builder.parse(inputStream);
  18. //找到根Element
  19. Element root=document.getDocumentElement();
  20. NodeList nodes=root.getElementsByTagName(RIVER);
  21. //遍历根节点所有子节点,rivers 下所有river
  22. River river=null;
  23. for(int i=0;i<nodes.getLength();i++){
  24. river=new River();
  25. //获取river元素节点
  26. Element riverElement=(Element)(nodes.item(i));
  27. //获取river中name属性值
  28. river.setName(riverElement.getAttribute(NAME));
  29. river.setLength(Integer.parseInt(riverElement.getAttribute(LENGTH)));
  30. //获取river下introduction标签
  31. Element introduction=(Element)riverElement.getElementsByTagName(INTRODUCTION).item(0);
  32. river.setIntroduction(introduction.getFirstChild().getNodeValue());
  33. Element imageUrl=(Element)riverElement.getElementsByTagName(IMAGEURL).item(0);
  34. river.setImageurl(imageUrl.getFirstChild().getNodeValue());
  35. rivers.add(river);
  36. }
  37. }catch (IOException e){
  38. e.printStackTrace();
  39. } catch (SAXException e) {
  40. e.printStackTrace();
  41. }
  42. catch (ParserConfigurationException e) {
  43. e.printStackTrace();
  44. }finally{
  45. try {
  46. inputStream.close();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. return rivers;
  52. }

  在这里添加到List中, 然后我们使用ListView将他们显示出来。如图所示:

android 解析XML方式(一)的更多相关文章

  1. android 解析XML方式(三)

    上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的.当然android的事件机制是基于回调函数的.在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SA ...

  2. android 解析XML方式(二)

    上一节中,我们使用DOM方式解析xml文档,该方式比较符合我们日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存.在这里我们可以用另外一种方式解析xml,这个就是SAX方式. SAX即是: ...

  3. android解析XML总结(SAX、Pull、Dom三种方式) <转载>

    android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...

  4. android解析xml文件的方式

    android解析xml文件的方式   作者:东子哥 ,发布于2012-11-26,来源:博客园   在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...

  5. Android解析XML(PULL方式)

    PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...

  6. Android几种解析XML方式的比较

    https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用 ...

  7. Android 解析XML—pull解析方式

    在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,其中PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部 ...

  8. Android解析XML

    在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...

  9. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

随机推荐

  1. UI2_视图切换

    // // ViewController.m // UI2_视图切换 // // Created by zhangxueming on 15/7/1. // Copyright (c) 2015年 z ...

  2. ListView Web 服务器控件概述(MSDN)

    1: "折叠"图像"展开"图像"复制"图像"复制悬停"图像 全部折叠全部展开 代码:全部 代码:多个 代码:Visual ...

  3. UML类图新手入门级介绍

    UML类图新手入门级介绍 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法. 首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用 ...

  4. 麦子学院Android开发Java教程ClassCastException 错误解析

    现在Java编程中经常碰到ClassCastException 错误,ClassCastException 是 JVM 在检测到两个类型间的转换不兼容时引发的运行时异常.此类错误通常会终止用户请求.本 ...

  5. win8.1环境下硬盘安装centos6.5双系统

    作为一名软件工程师或是相关行业的从业人员,经常会用到linux系统,这里为大家介绍的安装linux的方案是在原有win环境下安装linux双系统,两个系统选择分别为win8.1 和centos6.5. ...

  6. 如何在CentOS5中增加CentALT的源

    1. 建立centalt.repo    指令: vi /etc/yum.repos.d/centalt.repo 2. 將下面的內容貼進去    [CentALT]    name=CentALT ...

  7. 基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver

    ContentResolver / getContentResolver()   外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当 ...

  8. SQLServer数据库表中将指定列分组转一行

    不说明,直接看代码: --1. 创建表,添加测试数据 CREATE TABLE #test(code varchar(50), [values] varchar(10)) INSERT #test S ...

  9. Java对象校验框架之Oval

      只要有接口,就会有参数的校验,目前开源的校验框架已经非常多了,不过不得不提一下Oval.OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件.Annotation.POJO ...

  10. Spark菜鸟学习营Day6 分布式代码运行调试

    Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...