您的位置:首页 > 移动开发 > Android开发

Android应用开发之XML文件解析之一

2013-05-27 22:01 513 查看
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229
本节我们学习XML解析,在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,Pull三种解析方式。Android中内置的是Pull解析方式,因此Pull解析也就成为Android推荐的解析方式。接下来我们分别针对这三种XML解析方式进行讲解。

1SAX(Simple API for XML)

SAX是基于事件驱动的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应地触发不同方法来处理。它属于一次加载,可以处理任意大小的XML文件,它对内存的要求非常低,非常适合手机等移动终端设备。SAX采用的是读取文件的方式,把XML文件当作文本文件读,就只是读取,并不保存任何信息。SAX在解析XML过程中无法中断,只能读取XML文件而不能修改。

1.1常用回调方法(DefaultHandler类)

void startDocument() // 开始文档时触发
void endDocument() // 结束文档时触发
void startElement(String uri, String localName, String qName, Attributes atts) // 解析节点时触发
void endElement(String uri, String localName, String qName) // 结束节点时触发
void characters(char[ ] ch, int start, int length) // 处理文本节点

1.2创建SAX解析器

XMLReader reader = XMLReaderFactory.createXMLReader(); // 使用系统默认值来创建一个XMLReader
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); // 从给定的类名称来创建一个XMLReader
SAXParserFactory spFactory = SAXParserFactory.newInstance(); // 使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建
SAXParser sParser = spFactory.newSAXParser();

2Pull

Pull也是基于事件驱动的模型。Android中内置了Pull解析包。从字面上就可以看出来,Pull,拉取的意思。需要什么资源就“拉取”什么资源。如果需要的只是XML文件中的一部分,就“拉取”一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。

2.1常用回调事件

XmlPullParser.START_DOCUMENT // 开始文档事件
XmlPullParser.END_DOCUMENT // 结束文档事件
XmlPullParser.START_TAG // 开始节点事件
XmlPullParser.END_TAG // 结束节点事件

2.2获得Pull解析器

XmlPullParser parser = Xml.newPullParser();

3DOM(Document Object Model)

文档对象模型,它是基于对象的,又或者是基于树的。它属于两次加载,首先将整个文档载入内存,然后将文档解析形成一棵树。如果文档过大,对内存占用是很大的。但它可以在解析的过程中修改文件树,可以存储文件树的任意部分。

解析思路:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // 创建一个DocumentBuilderFactory实例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); // 创建DocumentBuilder
Document document = documentBuilder.parse(in); // 加载XML文档(Document)
Element root = document.getDocumentElement(); // 获取文档的根结点(Element)
NodeList nodes = root.getElementsByTagName(ELEMENT_ANDROID); // 获取根结点中所有子节点的列表(NodeList)
for (int i = 0; i < nodes.getLength(); i++) {...} // 使用迭代获取子节点列表中的需要读取的结点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: