网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > J2EE/J2ME
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.分析MIDP的高级事件处理机制.
.在J2ME/MIDP中实现图像旋转(二).
.MIDlet应用程序模型基础.
.从自定义字节数组创建图片.
.Servlet中jdbc应用高级篇之四.
.Petstore源码追踪记(3)-商业逻辑.
.BlueTooth探索系列(五)—J2ME蓝.
.将TOC从XML带到DHTML.
.贪吃蛇手机游戏.
.MIDP 1.0 HttpConnection类的rob.
.用Ant发布应用程序到OC4J.
.简述构建高性能J2EE应用的五种核.
.基于MIDP1.0实现屏幕滚动.
.实例说明锚点位置的定义.
.jboss3.2.1+Tomcat4.1.24的整合版.
.JavaRMI-IIOP入门.
.高可靠性移动应用程序-移动数据.
.基于Hibernate和Struts的J2EE应用.
.创建Mascot Capsule v3烟雾效果.
.J2ME中RMS的使用解析.

使用JSR172解析XML

发表日期:2007-12-23



         在上篇文章讲述了SonyEriCsson发布了更好支持企业级应用程序开发的新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());
    }
  使用JSR172解析XML
从这里下载源代码
总结:本文讲述了如何使用JSR 172提供的轻量级XML解析器来解析XML,并给出了具体的代码。下篇文章我们将一起学习一下如何使用Web Services的远程调用API。


(出处:)


上一篇:Filter技术的应用 人气:842
下一篇:使用 MIDP 列表组件 人气:1017
浏览全部J2EE/J2ME的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐