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。
分享到:
相关推荐
综上所述,在JDK 5中使用JSR105实现XML签名认证主要涉及到以下几个关键步骤:初始化`XMLSignatureFactory`、定义引用、读取并解析XML文档、构建签名信息以及生成私钥并创建签名。这些步骤确保了整个签名过程的安全性...
本篇文档《JDOM使用详解及实例(解析xml).pdf》将对JDOM的使用方法进行详细介绍,并提供实例来指导用户如何解析XML。 首先,JDOM提供了一种基于对象的XML表示方式。与DOM(文档对象模型)不同,JDOM不需要将XML文档...
#### 三、使用JDOM解析XML 为了更好地理解如何使用JDOM进行XML解析,我们可以通过一个简单的例子来展示这一过程: 1. **创建SAXBuilder实例:** 使用`new SAXBuilder()`创建一个新的`SAXBuilder`对象。 2. **加载...
### JSR 206: Java API for XML Processing (JAXP) 1.3 #### 一、概述 JSR 206定义了Java API for XML Processing(JAXP)1.3规范,该规范是Java平台处理XML文档的标准方式之一。此版本为JAXP带来了诸多改进和新...
**JSR 173 API**,全称为Java Specification Request 173,是Java社区进程(Java ...通过理解和使用JSR 173 API,开发者可以编写出更高效、内存占用更低的XML处理程序,这对于处理大数据量的XML应用场景至关重要。
它提供了解析XML文档并生成相应Java对象的能力,以及将Java对象转换为XML文档的功能。这个实现库通常与`jaxb-api.jar`一起使用,因为后者包含了JAXB的API定义,但不包含具体实现。 `jaxb-api.jar`则包含了JAXB的...
【标题】"jsr173_1.0_api.jar"是Java标准版的一个扩展,全称为Java Specification Request 173(JSR 173),它定义了Java编程语言对XML Streaming API(StAX - Streaming API for XML)的支持。这个API允许开发者以...
为了在这些设备上实现Web服务功能,Java Community Process (JCP) 定义了Java规范请求 172 (JSR 172),即Web服务API(WSA),它为J2ME提供了一套API,用于远程服务调用和XML解析。 **一、Web服务API的基础** JSR ...
另一方面,基于迭代器的API使用XMLEventReader,它将XML解析为一系列的事件对象,每个对象封装了特定的XML结构信息。XMLEventReader实现了Java的迭代器接口,使得处理XML事件变得更加直观和模块化。与基于指针的API...
通过使用`<context:component-scan>`标签配合特定的注解(如`@Component`、`@Service`等),可以完全避免XML配置的使用,从而让开发者能够更加专注于业务逻辑的实现。同时,Spring对JSR-250和JSR-330等标准的支持也...
- 接收方使用XMLSignatureFactory对象的unmarshalXMLSignature()方法解析XML签名。 - 调用XMLSignature.validate()方法验证签名。 10. 处理验证结果: - 如果验证成功,说明XML文件的完整性和来源可信;如果失败...
可能是Resolving XML Resolver的简称,它是一个用于解析XML文档时处理外部实体的工具。这个库可以帮助开发者处理XML文档中的引用,比如包含外部DTD(文档类型定义)或者XSLT样式表,使得XML解析更加灵活和可控。 3...
- **RPC/Literal风格**:描述了如何使用JSR-181注解来控制生成的WSDL文档的RPC/Literal风格,这有助于提高互操作性和可维护性。 #### 9. 参考资料 - **参考文献**:列出了一些关于Web服务和Java编程的重要参考资料...
此外,Oracle 11g支持JSR 170,即Java内容存储仓库API,增强了XML与PL/SQL的交互能力。新引入的simple_integer数据类型提供了非空且更快的整数处理,而虚拟列(Virtual Columns)功能让用户可以基于业务需求动态定义...
2. **xml-apis.jar**: 这个JAR文件包含了Sun Microsystems(现为Oracle)提供的XML APIs,这些API遵循了JSR 74(Java API for XML Processing 1.0),使得Java开发者可以方便地在程序中处理XML文档。xml-apis.jar...
**使用JSR 311 API的优势:** - **简单易用**:JSR 311 API的注解驱动模型使得开发RESTful服务变得非常直观。 - **可扩展性**:通过服务提供者接口(SPI),可以轻松添加自定义的解析器、过滤器和异常处理器。 - **...
### JSR180与SIP格式消息封装:深度解析 #### 核心知识点:JSR180标准与SIP消息封装 **JSR180**(Java Specification Request 180)是Java Community Process(JCP)中的一项提议,主要关注于在Java 2 Micro ...