android使用kxml解析XML
2014-07-31 22:57
441 查看
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.orgKMXL最新的网址为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=0 startDocument(parser); } boolean keepParsing = true; while (keepParsing) { int type = parser.next();// 之后就开始解析文档了。。。 switch (type) { case KXmlParser.START_TAG:// eventType=2 currTag=parser.getName(); getLabelProperty(parser);// 如果你对XML的内容很明确,那可以在这个方法中用getAttributeValue方法处理 break; case KXmlParser.END_TAG:// eventType=3 一般作用不大 break; case KXmlParser.TEXT:// eventType=4 getLabelText(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
相关文章推荐
- android_xml解析之 使用PULL读取XML文件 .
- android 使用SAX解析xml
- Android网络下使用SAX解析XML文档
- Android 创建与解析XML(六)—— 比较与使用
- android中使用哪种方式解析XML比较好
- Android中XML解析模块的使用方法
- Android成长之路-使用Pull解析XML
- Android 创建与解析XML(六)—— 比较与使用
- android 使用XmlResourceParser 解析XML
- android xml解析 XmlPullParser的使用
- android_xml解析之 使用SAX读取XML文件
- android使用pull的方式解析xml
- android使用pull方式解析xml
- Android 创建与解析XML(六)—— 比较与使用
- Android中的XML解析-DOM的使用与开发技巧(转)
- bak 6.android xml解析 XmlPullParser的使用.
- Android使用Pull解析器解析XML文件
- android 使用 pull 解析xml文件
- Android 创建与解析XML(六)—— 比较与使用
- Android 创建与解析XML(六)—— 比较与使用