在J2ME开发中解析XML

原创 2004年08月28日 21:37:00
        目前,XML已经广泛应用于数据交换领域,xml是基于纯文本的,具有优秀的跨平台特性。本文将讲述如何在J2ME中解析XML进行数据传输。

        XML写法比较简单,而且非常便于人来阅读。但是必须在客户端和服务器端有XML的解析器才可以正常通信,由于初期的移动信息设备内存和处理器上的不足,所以在MIDP1.0中并没有提供对XML的支持。随着内存和处理器的提高,对XML的支持成为了可能。在JSR182中提供了XML的解析器,但是这并不是标准MIDP中的API需要特定的实现才可以支持。幸运的是有第三方的API对解析xml提供了支持,比较有名的是kxml和nanoxml。

        使用XML之前,你必须考虑好是不是必须用它来传输数据,因为解析xml是比较耗费资源的,尤其是在CPU和内存的资源都很宝贵的条件下。如果我们能使用DataInputStream和DataOutputStream传输的话就尽量不要使用XML。XML的解析器有两种,一种是确认性的,他在解析之前会对xml的文档进行有效性的验证,确保这是应用程序需要的。另一种则是非确认性的,他不做验证工作直接进行解析,无疑这样的速度会快。kxml和nanoxml都是这样的解析器。它们也存在差别,kxml是增量解析器他会一点一点的解析,这样在解析大的文档的时候会效率比较高。nanoxml是一步解析器,一次就把文档解析完,如果文档很大的话,这无疑会耗费很大的内存。要使用kxml你可以从http://www.kxml.org 下载得到,在http://nanoxml.sourceforge.net 你可以下载nanoxml。

        要使用kxml,你必须首先得到一个XmlParser实例,它用Reader作为构造器的参数:
try {
    Reader    r = .....;
    XmlParser parser = new XmlParser( r );
}
catch( java.io.IOException e ){
    // handle exception....
}

如果你的xml文档存储在String内的话你可以使用ByteArrayInputStream和InputStreamReader:
String    xml = "<a>some xml</a>";
ByteArrayInputStream bin =
            new ByteArrayInputStream( xml.getBytes() );
XmlParser parser = new XmlParser( new InputStreamReader( bin ) );
当从网上接收数据的时候可以这样:
HttpConnection    conn = .....;
InputStreamReader doc =
         new InputStreamReader( conn.openInputStream() );
XmlParser parser = new XmlParser( doc );
得到parser实例后我们就可以调用read方法进行解析了,read方法会返回一个ParseEvent,通过判断他的类型我们就可以解析xml了。
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 ){
}

如果想使用nanoxml,那么你首先要创建一个kXMLElement实例,然后调用parseFromReader、parseString或者parseCharArray。由于他是一步解析器,那么它会把整个文档解析完后生成一个Object tree。每个节点都是一个kXMLElement的实例,通过调用getChildren等方法可以在这棵树上导航。
HttpConnection    conn = .....;
InputStreamReader doc =
         new InputStreamReader( conn.openInputStream() );
kXMLElement       root = new kXMLElement();

try {
    root.parseFromReader( doc );
}
catch( kXMLParseException pe ){
}
catch( IOException ie ){
}

下面是一个J2ME的应用程序简单演示了如何解析xml。如果有时间可以写写复杂的测试程序。你可以从如下地址下载源代码:XMLTest. 里面包括了kxml和nanoxml的源代码,如果想得到最新的源代码请参考他们的官方网站,在本站提供了kxml的在线API
package com.ericgiguere.techtips;

import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import nanoxml.*;
import org.kxml.*;
import org.kxml.parser.*;

/**
 * Simple MIDlet that demonstrates how an XML document can be
 * parsed using kXML or NanoXML.
 */

public class XMLTest extends MIDlet {

    // Our XML document -- normally this would be something you
    // download.
   
    private static String xmlDocument =
        "<list><item>apple</item>" +
              "<item>orange</item>" +
              "<item>pear</item></list>";
             
    private Display display;
    private Command exitCommand = new Command( "Exit",
                                               Command.EXIT, 1 );
                                              
    public XMLTest(){
    }
   
    protected void destroyApp( boolean unconditional )
                       throws MIDletStateChangeException {
        exitMIDlet();
    }
   
    protected void pauseApp(){
    }
   
    protected void startApp() throws MIDletStateChangeException {
        if( display == null ){ // first time called...
            initMIDlet();
        }
    }
   
    private void initMIDlet(){
        display = Display.getDisplay( this );
       
        String [] items;
       
        //items = parseUsingNanoXML( xmlDocument );
        items = parseUsingkXML( xmlDocument );
       
        display.setCurrent( new ItemList( items ) );
    }
   
    public void exitMIDlet(){
        notifyDestroyed();
    }
   
    // Parses a document using NanoXML, looking for
    // "item" nodes and returning their content as an
    // array of strings.
   
    private String[] parseUsingNanoXML( String xml ){
        kXMLElement root = new kXMLElement();
        try {
            root.parseString( xml );
           
            Vector list = root.getChildren();
            Vector items = new Vector();
           
            for( int i = 0; i < list.size(); ++i ){
                kXMLElement node =
                     (kXMLElement) list.elementAt( i );
                String      tag = node.getTagName();
               
                if( tag == null ) continue;
                if( !tag.equals( "item" ) ) continue;
               
                items.addElement( node.getContents() );
            }
           
            String[] tmp = new String[ items.size() ];
            items.copyInto( tmp );
            return tmp;
        }
        catch( kXMLParseException ke ){
            return new String[]{ ke.toString() };
        }
    }
   
    // Parses a document using kXML, looking for "item"
    // nodes and returning their content as an
    // array of strings.
   
    private String[] parseUsingkXML( String xml ){
        try {
            ByteArrayInputStream bin =
                            new ByteArrayInputStream(
                                     xml.getBytes() );
            InputStreamReader in = new InputStreamReader( bin );
            XmlParser parser = new XmlParser( in );
            Vector    items = new Vector();
           
            parsekXMLItems( parser, items );
           
            String[] tmp = new String[ items.size() ];
            items.copyInto( tmp );
            return tmp;
        }
        catch( IOException e ){
            return new String[]{ e.toString() };
        }
    }
   
    private void parsekXMLItems( XmlParser parser, Vector items )
                                     throws IOException {
        boolean inItem = false;
       
        while( true ){
            ParseEvent event = parser.read();
            switch( event.getType() ){
                case Xml.START_TAG:
                    if( event.getName().equals( "item" ) ){
                        inItem = true;
                    }
                    break;
                case Xml.END_TAG:
                    if( event.getName().equals( "item" ) ){
                        inItem = false;
                    }
                    break;
                case Xml.TEXT:
                    if( inItem ){
                        items.addElement( event.getText() );
                    }
                    break;
                case Xml.END_DOCUMENT:
                    return;
            }
        }
    }
   
    // Simple List UI component for displaying the list of
    // items parsed from the XML document.
   
    class ItemList extends List implements CommandListener {
   
        ItemList( String[] list ){
            super( "Items", IMPLICIT, list, null );
            addCommand( exitCommand );
            setCommandListener( this );
        }
       
        public void commandAction( Command c, Displayable d ){
            if( c == exitCommand ){
                exitMIDlet();
            }
        }
    }
}


J2ME及其移植

J2me及其移植   1. 简介 1.1 系统结构 Java ME 以往称作J2ME(Java Platform,Micro Edition),是为机顶盒、...
  • ydhua1988
  • ydhua1988
  • 2015年01月22日 09:22
  • 1166

android中使用SAX解析xml(封装)

SAX具体怎么用就不说了,网上搜搜一大片。 第一步:建立公共抽象类BaseHandler package com.dc.handler; import java.io.StringRead...
  • gundumw100
  • gundumw100
  • 2017年04月10日 18:08
  • 240

Android开发之使用PULL解析和生成XML

我曾在《浅谈XMl解析的几种方式》一文中介绍了使用DOM方式,SAX方式,Jdom方式,以及dom4j的方式来解析XML。除了可以使用以上方式来解析XML文件外,也可以使用Android系统内置的Pu...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2014年09月25日 23:19
  • 3213

【iOS开发】XML解析--GData语法

GData旨在解析XML文档。 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输...
  • a316212802
  • a316212802
  • 2016年01月14日 17:03
  • 743

java解析XML几种方式小结

java解析XML几种方式小结 第一种:DOM。 DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档...
  • yang5726685
  • yang5726685
  • 2016年11月30日 12:54
  • 542

玩转iOS开发 - JSON 和 Xml 数据解析

前言Json 和xml是网络开发中常用的数据格式,JSON轻量级,xml相对较复杂,所以现在用JSON的比例非常大,基本上从服务器获取的返回数据都是JSON格式的,作为iOS开发者,解析JSON, X...
  • liulanghk
  • liulanghk
  • 2015年06月08日 17:48
  • 4761

Android 个人学习笔记之--- DOM解析XML文件

昨天晚上发了一篇用SAX解析XML文件的博客,有兴趣的可以去看下,今天我用的DOM解析,DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存...
  • xiaanming
  • xiaanming
  • 2013年05月18日 00:31
  • 5365

iOS开发之解析XML格式数据

XML格式的数据是一种数据的传输格式,由于它方便编写,结构清晰,所以深受程序员的喜爱,很多人都喜欢使用XML格式传输数据或者作为程序的配置信息。现在我将来实现在iOS中解析XML格式数据,语言使用Sw...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015年08月06日 22:46
  • 1635

安卓xml使用第三方框架Xstream解析

//首先实例化XstreamXStream stream = new XStream(); stream.processAnnotations(MyBean.class);//这里需要...
  • Geri_Yang
  • Geri_Yang
  • 2016年06月01日 20:25
  • 1116

【代码】如何快速将J2me游戏移植到Android上

前言 小白:“老大,你让做的三个J2me游戏搞定了,请看DEMO。” 老大:“恩,不错,小白,你知道Android这个平台吧?” 小白:“恩,听过。听说和J2ME有很多共同点。” 老大:“(一阵奸...
  • u011884154
  • u011884154
  • 2013年09月11日 12:13
  • 1221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在J2ME开发中解析XML
举报原因:
原因补充:

(最多只允许输入30个字)