android使用kxml解析XML

来源:互联网 发布:c语言 创建 编辑:程序博客网 时间:2024/05/17 02:54

1、KMXL简介

要使用XML作为网络中传输通讯,势必在传输双方的发送方跟接收端都具备对XML文件的解析能力才能实现正常的数据交换并完成通讯过程。由于在移动设备硬件中的CPU跟内存的不足,跟网络传输速率的欠缺,而且解析XML需要消耗更多的资源,因此使得XML在移动设备中的使用收到了限制,在更多时候我们采用的是采用基于基本数据流的形式(如J2ME中的DataInputStream和DataOutputStream)在读取和发送数据。然而,随着智能手机硬件的提高跟普及以及3G网络的落实,使得在不久我们将能无顾虑地在移动通讯中使用XML了。   

在J2ME体系中,对xml的解析有比较有名的第三方解析API,分别为KXML和NanoXML,他们都提供了对解析xml的支持。KXML在解析XML过程中会对文件内容一层一层进行解析,因此成为增量式解析器,比较适合大文件的解析。而NanoXML是一次性解析器,在一次时间里就把整个xml文档解析完,因此不适合大文件的解析,会造成内存不足的现象。

KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。它有以下性能:  
• 支持XML名称空间   
• 用"松散"模式分析HTML或其它SGML格式   
• 占用很少的存储空间(21 kbps)   
• 基于Pull的分析   
• 支持XML写操作   
• 可选的DOM支持   

• 可选的WAP支持

kXML2 is currently hosted at kobjects.org. For kXML2 download, please visit kxml.org
KMXL最新的网址为http://kxml.org/,提供了支持安卓的JAR,下载地址为:http://jaist.dl.sourceforge.net/project/kxml/kxml2/2.3.0/kxml2-2.3.0.jar

2、KMXL使用

查看KXML JAVADOC文档,可以看到涉及到的只有为数不多的几个核心包:

Packages org.kxml2.io org.kxml2.kdom org.kxml2.wap org.kxml2.wap.syncml org.kxml2.wap.wml org.kxml2.wap.wv 

kxml简单的操作代码
package com.liuc;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import org.kxml2.io.KXmlParser;import org.xmlpull.v1.XmlPullParserException;public class KXMLTest {private static Map<String, Map<String, String>> attributeMap = new HashMap<String, Map<String, String>>();private static Map<String, String> textMap = new HashMap<String, String>();private static String currTag="";public static void main(String[] args) {InputStream in = KXMLTest.class.getClassLoader().getResourceAsStream("xml/xmlSampleL.xml");parseXMLUserKXML(in);}public static void parseXMLUserKXML(InputStream is) {int eventType = 0;KXmlParser parser = new KXmlParser();try {parser.setInput(is, "utf-8");eventType = parser.getEventType();if (eventType == KXmlParser.START_DOCUMENT) {// eventType=0startDocument(parser);}boolean keepParsing = true;while (keepParsing) {int type = parser.next();// 之后就开始解析文档了。。。switch (type) {case KXmlParser.START_TAG:// eventType=2currTag=parser.getName();getLabelProperty(parser);// 如果你对XML的内容很明确,那可以在这个方法中用getAttributeValue方法处理break;case KXmlParser.END_TAG:// eventType=3 一般作用不大break;case KXmlParser.TEXT:// eventType=4getLabelText(parser);break;case KXmlParser.END_DOCUMENT:// eventType=1 一般是用来结束循环的。endDocument(parser);keepParsing = false;break;}}} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void startDocument(KXmlParser parser) {System.out.println("========开始解析XML");}public static void endDocument(KXmlParser parser) {System.out.println(attributeMap);System.out.println(textMap);System.out.println("========结束解析XML");}/** * 获取标签的属性 *  * @param parser * @return */public static void getLabelProperty(KXmlParser parser) {// 一些标签属性可以在这里读取 PS:需要区分XML标签属性和标签内容的区别String tagName = parser.getName();int attributeCount = parser.getAttributeCount();if (attributeCount > 0) {attributeMap.put(tagName,getXMLLableAttribute(parser, attributeCount));}}private static Map<String, String> getXMLLableAttribute(KXmlParser parser,int attributeCount) {Map<String, String> map = new HashMap<String, String>();for (int i = 0; i < attributeCount; i++) {map.put(parser.getAttributeName(i), parser.getAttributeValue(i));}return map;}/** * 获取标签内容 *  * @param parser * @throws XmlPullParserException  */public static void getLabelText(KXmlParser parser) throws XmlPullParserException {//String tagName = parser.getName(); 这种方法是错误的,因为在读到文字的时候,已经过了tag,所以这个时候是获取不到tag名称的     boolean isWhiteSpace = parser.isWhitespace();     if(!isWhiteSpace)      {     String text = parser.getText().trim();     textMap.put(currTag, text);     }}}

工程目录结构:

XML文件内容

<?xml version="1.0" encoding="UTF-8"?><InterfaceFile><FileHeader><MessageID>MSGREPORT</MessageID></FileHeader><FileBody  id="111"><PK_ID>321</PK_ID><VERSION>2.0</VERSION><KEYWORD>张三</KEYWORD></FileBody></InterfaceFile>

输出结果
========开始解析XML{FileBody={id=111}}{PK_ID=321, VERSION=2.0, KEYWORD=张三, MessageID=MSGREPORT}========结束解析XML


参考:http://www.cnblogs.com/psunny/archive/2009/09/25/1573839.html

http://www.open-open.com/open23931.htm


1 0
原创粉丝点击