Android读写XML(上)
Android读写XML(上)——package说明
修改浏览权限|删除
XML经常用作Internet上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,来说明AndroidSDK提供的读写XML的package。
首先介绍下AndroidSDK与JavaSDK在读写XML文件方面,数据包之间的关系。Android平台最大的一个优势在于它利用了Java编程语言。AndroidSDK并未向标准JavaRuntimeEnvironment(JRE)提供一切可用功能,但它支持其中很大一部分功能。Java平台支持通过许多不同的方式来使用XML,并且大多数与XML相关的JavaAPI在Android上得到了完全支持。举例来说,Java的SimpleAPIforXML(SAX)和DocumentObjectModel(DOM)在Android上都是可用的,这些API多年以来一直都是Java技术的一部分,较新的StreamingAPIforXML(StAX)在Android中并不可用。但是,Android提供了一个功能相当的库。最后,JavaXMLBindingAPI在Android中也不可用,这个API已确定可以在Android中实现。AndroidSDK提供了如下package来支持XML的读写:
包功能介绍
javax.xml根据XML规范定义核心XML常量和功能。
javax.xml.parsers提供DOM和SAX方法解析XML文档
org.w3c.domW3C提供的使用DOM方法读取XML
org.xml.sax提供核心SAXAPIs
org.xmlpull.v1
额外补充说明下,在android.util数据包中也提供了一个类Xml,不过这个类就是把以上package简单封装了下。
读取XML主要有2种方法:DOM与SAX(SimpleAPIforXML),在这里对这2种方法分别加以说明。
DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来操组整个树结构,其他点如下:
*优点:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。
*缺点:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。
*使用场合:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)。
为了解决DOM解析XML引起的这些问题,出现了SAX。SAX解析XML文档为事件驱动,详细说明请阅读Android读写XML(中)–SAX。当解析器发现元素开始、元素结束,文本、文档的开始或者结束时,发送事件,在程序中编写响应这些事件的代码,其特点如下:
*优点:不用事先调入整个文档,占用资源少。尤其在嵌入式环境中,极力推荐采用SAX进行解析XML文档。
*缺点:不像DOM一样将文档长期驻留在内存,数据不是持久的,事件过后,如没有保存数据,那么数据就会丢失。
*使用场合:机器性能有限,尤其是在嵌入式环境,如Android,极力推荐采用SAX进行解析XML文档。
大多数时间,使用SAX是比较安全的,并且Android提供了一种传统的SAX使用方法,以及一个便捷的SAX包装器。如果XML文档比较小,那么DOM可能是一种比较简单的方法。如果XML文档比较大,但只需要文档的一部分,则XMLPull解析器可能是更为有效的方法。最后对于编写XML,Pull解析器包也提供了一种便捷的方法,详细说明请阅读Android读写XML(下)——数据写入XML文档。因此,无论我们的XML需求如何,Android都能在一定程度上满足我们的需求。
下面我们详细介绍采用DOM的方法,读取XML文档的思路,这基本上与XML的结构是完全一样的。首先加载XML文档(Document),然后获取文档的根结点(Element),然后获取根结点中所有子节点的列表(NodeList),然后使用再获取子节点列表中的需要读取的结点。根据以上思路,简要写个读取XML文件的例子如下:
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
importandroid.content.Context;
voidReadXML()
{
DocumentBuilderFactorydocBuilderFactory=null;
DocumentBuilderdocBuilder=null;
Documentdoc=null;
try{
docBuilderFactory=DocumentBuilderFactory.newInstance();
docBuilder=docBuilderFactory.newDocumentBuilder();
//xmlfile放到assets目录中的
doc=docBuilder.parse(context.getResources().getAssets().open(”weather.xml”));
//rootelement
Elementroot=doc.getDocumentElement();
//Dosomethinghere
//getaNodeListbytagname
NodeListnodeList=root.getElementsByTagName(”tag”);
for(inti=0;i<nodeList.getLength();i++)
{
Nodend=nodeList.item(i);
//ReadNode
}
}catch(IOExceptione){
}catch(SAXExceptione){
}catch(ParserConfigurationExceptione){
}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文件的读写只是基础,相信在以后的网络、数据库的开发中会经常使用。