中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > J2ME
手机开发新气象 教您使用JSR172解析XML
作者:mingjava 时间:2006-09-22 09:31 出处:J2ME开发网 责编:月夜寒箫
              摘要:手机开发新气象 教您使用JSR172解析XML
Sony Ericsson发布了更好支持企业级应用程序开发的新JSR,这其中就包括J2ME Web Service 1.0(JSR 172),索尼爱立信的W600就支持了JSR172。本文讲述如何使用JSR 172提供的API来解析XML。

我们知道JSR172是由两个部分组成的:

1. 一个轻量级的标准XML解析器 2. Web Services的远程调用API

其中这个JSR172实现的轻量级的XML解析器是JAXP1.2(Java API for XML Processing)的一个子集。我们可以查看WTK提供的API看到j2me-xml提供的类一共只有12个,这说明这个轻量级的XML解析器是适合在移动电话这种资源受限设备上运行的。下面我们通过一个例子介绍如何使用JSR 172解析XML,首先我们需要准备一个XML文件放在项目当中,内容如下:

诺基亚7610 黑色

值得注意的是当XML文件中包含汉字的时候,我们应该使用文本工具,比如notepad或者Ultral Edit等把它转换成UTF-8编码文件,否则解析的结果将包含乱码。为了保存XML文件中的信息,我们构造一个普通的Java类Phone,它包含两个成员变量分别对应name和colour,代码如下所示:

/*
            * Phone.java
            *
            * Created on 2005年8月6日, 下午9:40
            *
            * To change this template, choose Tools | Options and locate the template under
            * the Source Creation and Management node. Right-click the template and choose
            * Open. You can then make changes to the template in the Source Editor.
            */
            /**
            *
            * @author Administrator
            */
            public class Phone {
            private String colour = "";
            private String name = "";
            /** Creates a new instance of Phone */
            public Phone() {
            }
            public String getColour() {
            return colour;
            }
            public void setColour(String colour) {
            this.colour = colour;
            }
            public String getName() {
            return name;
            }
            public void setName(String name) {
            this.name = name;
            }
            }

在JSR 172中实现的是SAX模式的解析器,它和DOM模式的不同在于,SAX解析器按照顺序解析文件并不保存其内容,而DOM解析器则是首先把XML文件解析后存储在一个对象树中,可见DOM模式更加耗费内存资源。能够解析XML之前首先需要创建SAXParser的实例,

 

SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

接下来我们要获得XML文件的输入流,并把它作为其中一个参数传递给saxParser的parse方法,

 

InputStream is = this.getClass().getResourceAsStream("phone.xml");
            saxParser.parse(is,new BasicHandler(this));

那么SAXParser是如何解析xml文件的呢?DefaultHandler是SAX2默认的事件处理器基类,用于处理XML解析事件的方法如下:

 

startDocument()
            startElement(java.lang.String uri,
            java.lang.String localName, java.lang.String qName, Attributes attributes)
            characters(char[] ch, int start, int length)
            endElement(java.lang.String uri,
            java.lang.String localName, java.lang.String qName)
            endDocument()

默认情况下,DefaultHandler的上述方法什么也不做,因此我们必须自己扩展DefaultHandler并且覆盖上述的方法。我们的程序中提供了一个BasicHandler用来处理xml文件。class BasicHandler extends DefaultHandler在BasicHandler类中有两个成员变量

 

private Vector phones = new Vector();
            private Stack tagStack = new Stack();

phones用来存储我们已经解析出来的Phone对象,tagStack则用来存放我们解析到的元素名称,比如sonyericsson,phone,name,colour等。在文档解释结束后,也就是在endDocument()方法内我们把解析的结果显示在手机屏幕上,为了让读者可以更清楚地明白SAX解析器的解析顺序,这里笔者用了一些打印语句来把重要的信息打印出来,BasicHandler的几个重要方法如下:

 

public void startDocument() throws SAXException {}
            public void startElement(String uri, String localName,
            String qName, Attributes attributes) throws SAXException {
            System.out.println("the qName is "+qName);
            if(qName.equals("phone")) {
            Phone phone = new Phone();
            phones.addElement(phone);
            }
            tagStack.push(qName);
            System.out.println("the tag stack's length is "+tagStack.size());
            }
            public void characters(char[] ch, int start, int length)
            throws SAXException {
            String chars = new String(ch, start, length).trim();
            System.out.println("the character is "+chars);
            if(chars.length() > 0) {
            String qName = (String)tagStack.peek();
            Phone currentPhone = (Phone)phones.lastElement();
            if (qName.equals("name")) {
            currentPhone.setName(chars);
            } else if(qName.equals("colour")) {
            currentPhone.setColour(chars);
            }
            }
            }
            public void endElement(String uri, String localName, String qName)
            throws SAXException {
            System.out.println("the end qName is "+qName);
            tagStack.pop();
            }
            public void endDocument() throws SAXException {
            StringBuffer result = new StringBuffer();
            for (int i=0; i
            Phone currentPhone = (Phone)phones.elementAt(i);
            result.append(currentPhone.getName() + " 是 " + currentPhone.getColour() + "\n");
            }
            helloXML.alert(result.toString());
            }

总结:本文讲述了如何使用JSR 172提供的轻量级XML解析器来解析XML,并给出了具体的代码。下篇文章我们将一起学习一下如何使用Web Services的远程调用API。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有