因为公司需要,刚开始学J2ME,理解的不好的请大家多指教!
解析XML文件的2种方式:SAX和DOM
SAX(Simple API for XML)是基于事件的解析XML的一种规范。
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文本(characters)等地方时通知事件监听器,由事件监听器调用相应的函数做相应处理,然后继续扫描,直至文档结束。
SAX解析的主要由2个组件来完成。
1,解析器:负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件
2,事件处理器: 事件处理器则负责对事件作出响应,通过对解析器传递过来的数据进行处理(特定方法的实现)完成对事件的相应。
具体代码的实现:
1,创建解析器
SAXParserFactory类通过 newInstance()静态方法创建一个工厂类的对象,然后这个对象调用其newSAXParser()方法创建一个SAXParser解析器的对象。
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
2,创建事件处理器
在J2SE中,一个类通过实现contentHandler,entityHandler,DTDHandler,ErrorHandler接口里面所有的方法来使自己成为一个事件处理器(可不必全部实现这些接口,但是必须实现某一接口里面所有的方法),而在J2ME里面做了简化操作,J2ME API中defaultHandler类(org.xml.sax.helpers.DefaultHandler
)实现了上述接口,但是方法都是空实现,我们可以通过继承这个类,有选择性的重写自己需要的方法,而不必去全部实现(适配器模式)。
public class XMLHandler extends DefaultHandler {
public static void main(String[] args) {
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
//创建事件处理器
XMLHandler handler=new XMLHandler();
//解析器调用其parse()方法通过传入数据源的InputStream和事件处理器进行解析
parser.parse(handler.getClass().getResourceAsStream("demo.xml") , handler);
}
//文档遍历完时触发
public void endDocument() throws SAXException {
System.out.println("end document......");
}
//开始遍历文档时触发
public void startDocument() throws SAXException {
System.out.println("start document.....");
}
//(标记)元素扫描结束时触发
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("对<"+qName+">的解析完成");
}
//最重要的方法,开始扫描某元素时触发
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//uri:表示如果解析器支持名称空间,uri表示名称空间,没有返回空,不支持亦如此
//localName:解析器支持名称空间则表示标记(元素)名称,不支持则为空
//qName:如果标记(元素)带有名称空间前缀,则表示带前缀的标记(元素)名称, 如果没有这表示标记名称
// attributes表示当前元素拥有属性的集合
System.out.println("对<"+qName+">的解析开始");//对XXX元素开始解析
for(int i=0;i<attributes.getLength();i++){ //遍历属性集合
System.out.println(attributes.getQName(i)+":"+attributes.getValue(i));
}
System.out.println("atts:"+attributes.getLength()); //属性个数
}
public void characters(char[] ch, int start, int length)
throws SAXException {
//解析到文本(包括空文本)时触发的事件:<h2><font>hello<font></h2>
If(length>0){
System.out.println("characters:"+new String(ch, start, length)); //不为空才输出
}
}
}
举例说明:
win.xml
<?xml version="1.0" encoding="utf-8"?>
<winInfo>
<colorball name="双色球" date="2010-06-03" period="2010063">
<blue num1="02" num2="06" num3="10" num4="17" num5="23" num6="24"/>
<red number="03"/>
</colorball>
<d3 name="3D" date="2010-4-6" period="2010056">
<number number="789"/>
</d3>
<le7 name="七乐彩" date="2010-6-7" period="2010078">
<ordinary num1="02" num2="06" num3="10" num4="17" num5="23" num6="24"/>
<special number="03"/>
</le7>
</winInfo>
Java代码:
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equals("colorball")){
System.out.println("--------");
for(int i=0;i<attributes.getLength();i++){
System.out.print(attributes.getQName(i)+"="+attributes.getValue(i)+"\t");
}
}else if(qName.equals("blue")){
System.out.print("\n"+"blue:");
for(int i=0;i<attributes.getLength();i++){
System.out.print(attributes.getValue(attributes.getQName(i))+"\t");
}
}else if(qName.equals("red")){ System.out.println("\n"+"red:"+attributes.getValue(attributes.getQName(0)));
}else if(qName.equals("d3")){
System.out.println("--------");
for(int i=0;i<attributes.getLength();i++){ System.out.print(attributes.getQName(i)+"="+attributes.getValue(i)+"\t");
}
}else if(qName.equals("le7")){
System.out.println("--------");
for(int i=0;i<attributes.getLength();i++){ System.out.print(attributes.getQName(i)+"="+attributes.getValue(i)+"\t");
}
}else if(qName.equals("ordinary")){
System.out.print("\n"+"普通号码:");
for(int i=0;i<attributes.getLength();i++){
System.out.print(attributes.getValue(i)+"\t");
}
}else if(qName.equals("special")){
System.out.println("\n"+"特殊号码:"+attributes.getValue(0));
}else if(qName.equals("number")){
System.out.println("\n"+"number:"+attributes.getValue(0));
}
}
-----------------------------------------------------------
使用开源组件kxml解析xml
NewFile.xml
<?xml version="1.0" encoding="UTF-8"?>
<winInfo>
<lottery type="双色球" date="2010-06-03" period="2010063">
<blue num1="02" num2="06" num3="10" num4="17" num5="23" num6="24"/>
<red number="03"/>
</lottery >
<lottery type="双色球" date="2010-06-01" period="2010062">
<blue num1="11" num2="13" num3="15" num4="20" num5="31" num6="33"/>
<red number="03"/>
</lottery>
<lottery type="双色球" date="2010-05-30" period="2010061">
<blue num1="02" num2="04" num3="16" num4="19" num5="22" num6="26"/>
<red number="12"/>
</lottery>
</winInfo>
Java代码:
public static void main(String[] args) throws Exception {
//采用字符流读取含中文的xml文件时必须指定编码格式,不然会报错
XmlParser parser = new XmlParser(new InputStreamReader(Test.class.getResourceAsStream("NewFile.xml"), "utf-8"));
boolean keepParse = true;
while (keepParse) {
// 解析器扫描(读取)文档,触发(返回)一个事件ParseEvent。
ParseEvent event = parser.read();
switch (event.getType()) {
case Xml.START_DOCUMENT:// 遇到文档开头
System.out.println("start document...");
break;
case Xml.END_DOCUMENT:// 遇到文档结尾
keepParse = false;// 将keepParse置为false,结束文档扫描
System.out.println("end document...");
break;
case Xml.START_TAG:// 遇到某元素开始
String elementName = event.getName();
if (elementName.equals("lottery")) {
System.out.println("\n-------------------");
System.out.println("start:" + event.getName());// 通过被触发的事件(封装了事件的信息),获取该元素(事件源)的元素名
Vector atts = event.getAttributes();//获取属性集合
if (atts != null) {
for (int i = 0; i < atts.size(); i++) {
Attribute att = (Attribute) atts.elementAt(i);//取得单个属性
System.out.print(att.getName() + ":" + att.getValue() + "\t");
}
}
} else if (elementName.equals("blue")) {
Vector atts = event.getAttributes();
System.out.println("\n" + "blue:");
if (atts != null) {
for (int i = 0; i < atts.size(); i++) {
Attribute att = (Attribute) atts.elementAt(i);
System.out.print(att.getValue()+"\t");
}
}
} else if (elementName.equals("red")) {
System.out.print("\n" + "red:" + event.getAttribute(0).getValue());
}
break;
case Xml.END_TAG: //遇到元素结尾
if(event.getName().equals("lottery")){
System.out.print("\nend lottery....");
}
break;
default:
break;
}//switch结束
}//while结束
}//main结束
分享到:
相关推荐
描述中提到的"j2me上的微型解析器"指的是专为J2ME设计的XML解析库,旨在在内存有限的移动设备上有效地解析XML文档。这种微型解析器通常不会像Java SE或Java EE环境中的解析器那样消耗大量内存,而是通过优化算法和...
**标题:“kuixdemo-1.0.0 (J2ME下解析xml文件)”,意味着这是一个专门用于在Java 2 Micro Edition (J2ME)环境中解析XML文件的示例程序。** **描述:“在J2ME下对XML文件进行解析的示例源码及帮助文件”指出,该...
标题"Jaxp_xml.rar_J2ME程序_j2me_j2me_xml_j2me网络"表明这个压缩包包含了一个示例,演示如何使用JAXP(Java API for XML Processing)在J2ME环境中解析XML文件。JAXP是Java平台上的一个标准接口,用于处理XML文档...
上述代码示例提供了一个基础框架,展示了如何在J2ME环境中使用SAX解析器来解析WML,但实际应用中可能需要更复杂的逻辑来处理各种标签和属性。 值得注意的是,由于J2ME和WML都是较早的技术,现代移动开发已转向更...
事件驱动意味着在解析XML文档的过程中,解析器会触发一系列事件,如开始元素、结束元素、文本内容等,开发者可以通过注册事件处理器来对这些事件进行响应。 在KXML2-2.3.0.jar中,包含了完整的KXML库,提供完整的...
它提供了解析XML文档的能力,包括读取元素、属性、文本等,并且不需要DOM或SAX支持,这使得它在J2ME平台上具有较高的效率。 3. **XML解析**:在J2ME浏览器中,XML解析是关键部分,因为许多网页内容是以XML格式或者...
服务器解析XML文档,执行相应的方法,并返回同样格式的XML响应。这种简单而通用的机制使得XML-RPC能够在多种语言和平台上实现互操作。 3. **J2ME实现XML-RPC的步骤** - **建立连接**:J2ME程序首先需要创建一个...
使用DOM解析XML时,整个文档会被加载到内存中,并构建出一个树形结构表示文档内容。这种方式非常适合需要频繁访问文档不同部分的应用场景。然而,这也意味着DOM可能会消耗较多的内存资源,特别是当处理大型XML文档时...
KXML提供了DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式,前者将整个XML文档加载到内存中,适合小规模数据处理;后者则采用事件驱动,按需解析,适合处理大型XML文件。 **2. WAP协议** ...
- **数据解析模块**:可能采用DOM或SAX解析XML,或使用Gson、Jackson等库解析JSON,将数据结构化。 - **用户界面模块**:使用MIDP UI组件创建股票列表、K线图等视图,并实时更新显示。 - **数据缓存模块**:...
3. **事件驱动模型**:类似于SAX解析器,KXML2采用事件驱动的方式解析XML,只在需要时加载和处理数据,减少了内存消耗。 4. **简单API**:KXML2的API设计直观,易于理解和使用,开发者可以快速上手。 在J2ME项目中...
KXML2库则用于解析XML文档,支持DOM和SAX两种解析方式。具体实现过程中,首先使用HttpConnect API向服务器发送HTTP GET或POST请求,然后服务器返回XML格式的数据。在移动设备端,通过KXML2库解析返回的XML数据,并将...
《深入理解KXML2:解析XML的...总结,KXML2是J2ME环境中解析XML的理想选择,其高效、小巧的特性使其在资源有限的设备上表现出色。通过深入研究提供的源码和文档,开发者能够充分利用KXML2的功能,实现高效的XML处理。
例如,可能会用到`HttpConnection`类进行网络请求,`InputStreamReader`读取响应,以及可能的DOM或SAX解析器处理返回的XML数据。 5. **www.pudn.com.txt**: 这可能是项目来源或者原始发布者的信息,也可能包含了...
如果是XML数据,可以使用`javax.xml.parsers`包中的SAX或DOM解析器。 在解析完天气数据后,J2ME程序需要将这些信息以友好的方式展示在移动设备的屏幕上。这涉及到用户界面的设计,J2ME提供了Midlet类作为应用程序的...
对于SAX解析,开发者还需要实现`XmlPullParserHandler`接口,定义处理XML事件的方法。如果是使用DOM解析,可以使用`DocumentBuilder`来构建一个完整的XML文档树。 在移动平台上,性能优化至关重要。KXML因其轻量级...
NanoXML库的设计目标是提供一个轻量级的解决方案,用于读取和解析XML文档,而不依赖于大型的Java XML API如DOM(Document Object Model)或SAX(Simple API for XML)。这对于嵌入式设备或移动设备等内存受限的环境...
对于需要在J2ME平台上解析XML的项目,虽然MicroParser不再维护,但依然可以作为一个起点,或者对其代码进行改进以满足当前的需求。 6. **XML解析应用场景**:在J2ME平台上,XML常用于数据交换、配置文件读取、网络...
3. PULL 解析:PULL 解析常常用在 J2ME 对于节点处理比较好,类似 SAX 方式,同样很节省内存,在 J2ME 中我们经常使用的 KXML 库来解析。 五、ListView 的优化方案 1. 自定义适配器,在 getView 方法中要考虑方法...