分享
 
 
 

手机开发 教您使用JSR172解析XML

王朝html/css/js·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有