Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1219243
  • 博文数量: 233
  • 博客积分: 6270
  • 博客等级: 准将
  • 技术积分: 1798
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 08:32
文章分类

全部博文(233)

文章存档

2011年(31)

2010年(202)

我的朋友

分类: 嵌入式

2010-12-14 11:55:53

XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,来说明Android SDK提供的读写XMLpackage

首先介绍下Android SDKJava SDK在读写XML文件方面,数据包之间的关系。Android 平台最大的一个优势在于它利用了 Java 编程语言。Android SDK 并未向标准 Java Runtime Environment (JRE) 提供一切可用功能,但它支持其中很大一部分功能。Java 平台支持通过许多不同的方式来使用 XML,并且大多数与 XML 相关的 Java API Android 上得到了完全支持。举例来说,Java Simple API for XML (SAX) Document Object Model (DOM) Android 上都是可用的,这些 API 多年以来一直都是 Java 技术的一部分,较新的 Streaming API for XML (StAX) Android 中并不可用。但是, Android 提供了一个功能相当的库。最后,Java XML Binding API Android 中也不可用,这个 API 已确定可以在 Android 中实现。Android SDK提供了如下package来支持XML的读写:

功能介绍

javax.xml

根据 XML 规范定义核心 XML 常量和功能。

javax.xml.parsers

提供DOMSAX方法解析XML文档

org.w3c.dom

W3C提供的使用DOM方法读取XML

org.xml.sax

提供核心SAX  APIs

org.xmlpull.v1

额外补充说明下,在android.util数据包中也提供了一个类Xml,不过这个类就是把以上package简单封装了下。

读取XML主要有2种方法:DOMSAX(Simple API for XML),在这里对这2种方法分别加以说明。

DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来操组整个树结构,其他点如下:

·         优点:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。

·         缺点:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。

·         使用场合:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)。

为了解决DOM解析XML引起的这些问题,出现了SAX。当解析器发现元素开始、元素结束,文本、文档的开始或者结束时,发送事件,在程序中编写响应这些事件的代码,其特点如下:

·         优点:不用事先调入整个文档,占用资源少。尤其在嵌入式环境中,极力推荐采用SAX进行解析XML文档。

·         缺点:不像DOM一样将文档长期驻留在内存,数据不是持久的,事件过后,如没有保存数据,那么数据就会丢失。

·         使用场合:机器性能有限,尤其是在嵌入式环境,如Android,极力推荐采用SAX进行解析XML文档。

大多数时间,使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。如果XML文档比较小,那么 DOM 可能是一种比较简单的方法。如果XML文档比较大,但只需要文档的一部分,则 XML Pull 解析器可能是更为有效的方法。最后对于编写 XMLPull 解析器包也提供了一种便捷的方法。因此,无论我们的 XML 需求如何,Android 都能在一定程度上满足我们的需求。

下面我们详细介绍采用DOM的方法,读取XML文档的思路,这基本上与XML的结构是完全一样的。首先加载XML文档(Document),然后获取文档的根结点(Element),然后获取根结点中所有子节点的列表(NodeList),然后使用再获取子节点列表中的需要读取的结点。根据以上思路,简要写个读取XML文件的例子如下:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.content.Context;
void ReadXML()
{
    DocumentBuilderFactory docBuilderFactory = null;
    DocumentBuilder docBuilder = null;
    Document doc = null;
    try {
        docBuilderFactory = DocumentBuilderFactory.newInstance();
        docBuilder = docBuilderFactory.newDocumentBuilder();
        //xml file 放到 assets目录中的

        doc = docBuilder.parse(context.getResources().getAssets().open(“weather.xml”));
        //root element

        Element root = doc.getDocumentElement();
        //Do something here

        //get a NodeList by tagname

        NodeList nodeList = root.getElementsByTagName(“tag”);
        for(int i =0;i< nodeList.getLength();i++)
        {
            Node nd = nodeList.item(i);
            //Read Node

        }
    } catch (IOException e) {
    } catch (SAXException e) {
    } catch (ParserConfigurationException e) {
    } finally {
        doc = null;
        docBuilder = null;
        docBuilderFactory = null;
    }
}

以上代码比较简单,就不在此详细解析了。

采用DOM读取XML文件,需要加载整个XML文件,在XML文件比较大的情况下,会导致Android设备内存紧张,为了避免这个问题,也可以采用SAX的方法读取XML文件,不过SAX对结点的排序、增加结点等方面的操作相比DOM就有些复杂了。根据XML文件大小、数据处理的需求,选择合适的读取的方法。

对于XML的写入,一方面可以采用前面介绍的这些package;另外一方面也可以按照XML的标准,将数据以字符串的形式直接写入文件,这也是种很不错的方法。在这里推荐IBM开源社区中一篇比较好的文章 Android 上使用 XML,有兴趣的可以去深入学习下。

总结说明

XML作为一种简单的文件格式,作为网络上数据交换的基础,而且得到了大部分数据库的支持(直接将XML文件插入数据库),XML文件的读写只是基础,相信在以后的网络、数据库的开发中会经常使用。
阅读(1357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~