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

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.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=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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: