使用NanoXml解析xml
文章信息
Contents |
Introduction
NanoXML是一个能在CLDC环境(手机环境)下运行的开放源代码非确认性(不做验证工作直接进行解析)的XML 分析器。Nanoxml是一步解析器(非常小6KB的XML解析器),一次就把文档解析完并以一个树状的结构传回。
在 Java ME平台中有很多用于解析XMl的API:
- ASXMLP 020308
- kXML 2.0 alpha
- kXML 1.2
- MinML 1.7
- NanoXML 1.6.4
- TinyXML 0.7 (disabled broken link to www.gibaradunn.srac.org/tiny/)
- Xparse-J 1.1
尽管对于xml的解析 有这么多可选,但是NanoXML使用是比较简单,再加上其代码非常精简,高效,占用存储空间小,所以是我们在开发MIDlet时很好的选择。*
原理
每个xml文件被解析成一个 kXMLElement,里面包含 标签名(name),标签内容(contents),子标签(children:List<XmlElement>),属性<attributes:Map>,然后子标签递归下去,就能遍历整个xml文件了。 主要递归的方法是一个叫做scanElement(XmlElement)的方法。
使用
下面以一个例子演示如何使用NanoXML来解析一个XML文件。
有如下一个XML,保存了两个user的信息。
<?xml version="1.0" ?>
<Users>
<user Type="vip">
<name>Zhang Jing</name>
<age>22</age>
<sex>man</sex>
<ID>0001</ID>
</user>
<user Type="common">
<name>Liu Bi</name>
<age>42</age>
<sex>woman</sex>
<ID>0003</ID>
</user>
</Users>
解析后显示如下:
首先新开一个线程, 使用InputStreamReader 把xml以流的形式读取进来。 element.parseFromReader(input) 这一句就是真正的对xml文件的解析,解析后的数据保存在了kXMLElement 中。
new Thread(){
public void run(){
InputStreamReader input = new InputStreamReader(getClass().getResourceAsStream("/xml_demo_1.xml"));
kXMLElement element = new kXMLElement();
try {
element.parseFromReader(input);
readData(element);
} catch (kXMLParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
接下来就是从kXMLElement 中取出我们需要的信息:
public void readData(kXMLElement element) {
Enumeration e = element.enumerateChildren();
kXMLElement childElement = null;
int i = 0;
while(e.hasMoreElements()) {
childElement = (kXMLElement) e.nextElement();
if(childElement.getTagName().equals("user")) {
this.form.append(new StringItem("New User : ", Integer.toString(++i) ));
readData(childElement);
} else {
this.form.append(new StringItem(childElement.getTagName(), childElement.getContents()));
}
}
}
例程下载
# XMLReadDemo.zip 例程 下载




(no comments yet)