android使用kxml解析XML

10 篇文章 0 订阅

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值