该如何使用 kXML 呢?
从 http://www.kxml.org/ 下载 kXML 原始码,并且将 kXML 类别包含进您的应用程序。并不是所有的类别都是需要的,所以只要下载包含最小 kXML 的 ZIP 檔。在安装完这个档案后,新增下面的引入陈述到您的程序中。
import org.kxml.*; import org.kxml.parser.*; |
当您准备好去分析一份文件时,产生一个 XmlParser 类别实体,传入一个字符 (character) 流当唯一的参数。
try { Reader r = .....; XmlParser parser = new XmlParser( r ); } catch( java.io.IOException e ){ // handle exception.... } |
如果您的文件是以字符串被储存,举例来说,您可以借着转换字符串成为一个字节 (byte) 数组来读取它,然后,结合 InputStreamReader 和 ByteArrayInputStream:
// 读取字符串 (exception handling omitted) String xml = "some xml"; ByteArrayInputStream bin = new ByteArrayInputStream( xml.getBytes() ); XmlParser parser = new XmlParser( new InputStreamReader( bin ) ); |
然而,更可能发生的情节是,从网络接收一份文件,举例来说,在 CLDC 的通常连结架构 (GCF),您使用 MIDP 内建支持 HTTP 的类别来做这件事,然后您会使用 GCF 回传的输入流 (input stream),并且转换它成为字符流 (character stream):
// Read from web (exception handling omitted) HttpConnection conn = .....; InputStreamReader doc = new InputStreamReader( conn.openInputStream() ); XmlParser parser = new XmlParser( doc ); |
析器被产生后,您呼叫它的 read 方法去读取文件分开的区块。read 方法对文件的每一个组件回传一个 ParseEvent 对象:
try { boolean keepParsing = true; while( keepParsing ){ ParseEvent event = parser.read(); switch( event.getType() ){ case Xml.START_TAG: ..... // handle start of an XML tag break; case Xml.END_TAG: ..... // handle end of an XML tag break; case Xml.TEXT: ..... // handle text within a tag break; case Xml.WHITESPACE: ..... // handle whitespace break; case Xml.COMMENT: ..... // handle comment break; case Xml.PROCESSING_INSTRUCTION: ..... // handle XML PI break; case Xml.DOCTYPE: ..... // handle XML doctype break; case Xml.END_DOCUMENT: ..... // end of document; keepParsing = false; break; } } } catch( java.io.IOException e ){ } |
ParseEvent 类别为回传的组件信息定义了许多方法。getType 方法,举例来说,回传组件的型别,像是它是否是一个卷标 (tag) 的开头、一个批注等。其它的方法提供了额外的讯息,像是一个卷标的内文或一个卷标的属性。当 END_DOCUMENT 事件被触发时,分析器便停止运作。
kXML 使得对一个文件递归下降的分析方式变的相当容易,分析器的状态是被呼叫方法维持,递归的反映到一个新的分析事件。在简单的情况下,您可以利用这个方法来保持追踪您最后一个看过的卷标。
使用 NanoXML,必须下载一些原始码。官方的 NanoXML 网站是 http://nanoxml.sourceforge.net/。
一个修改过的 NanoXML 版本,能够与 CLDC 并存 (原本的 NanoXML 只适合以 J2SE 为基础的系统) 可以在 http://www.ericgiguere.com/nanoxml 找到。就像 kXML,必须将 NanoXML 包含到您的程序中,然后新增下面的引入陈序到您的程序:
import nanoxml.*;
去分析一份文件,产生一个 kXMLElement 类别的实体,并且选择使用 parseFromReader、parseString 或 parseCharArray 其中之一:
由于 NanoXML 是一个单一步骤的分析器,它分析全部的文件,并且转换它成为一个树状的XML组件。树状图的根部是您所产生的 kXMLElement 实体,且每一个树状图的节点是另一个 kXMLElement 实体。您可以使用像是 getChildren、getTagName 和 getContents 的方法穿越这棵树。