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.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=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
- android使用kxml解析XML
- 使用kxml解析xml
- 使用KXML解析xml数据
- 使用kxml解析xml文件(一)
- 使用kxml解析xml文件(二)
- Kxml解析xml总结
- Android kxml解析WBXML
- 微型XML解析器:kXML
- 如何使用kxml解析WAP
- 如何使用kxml解析WAP
- 如何使用kxml解析WAP
- j2me中kxml解析xml实例
- j2me中kxml解析xml实例
- kxml解析 xml的两种方式
- J2ME KXML 解析中文xml代码示例
- J2ME 的XML 解析器 kXML
- j2me中kxml解析xml实例----2.xml
- KXml使用
- hdu 3405 World Islands
- Node.js模块定义
- 64位系统下注册32位dll文件
- Android中对标签进行监听的方法
- TCP的长连接与短连接
- android使用kxml解析XML
- DOMContentLoaded事件
- SupremeWord进度38.2%
- 循环结构总结
- DB-DAY3 一个简单的图片特效
- IT忍者神龟之 JSP中EL表达式语言不能使用的解决方法
- org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException:
- iphone开发笔记:地图注解(地图上的大头针)
- 关于八皇后问题的解答