| |
在JDK 6.0中基于StAX分析XML数据 |
|
时间: 2006-06-13 来自:天极开发 |
 |
|
五、 使用XMLStreamReader进行分析
通过使用XMLStreamReader
API分析列表1中的文档,我们来详细分析一下其工作原理。XMLStreamReader使用一种光标分析XML文档。它的接口包含一个next()方法-由它分析下一个分析事件。getEventType()方法返回事件类型。后面的代码片断来自于XMLParser.java应用程序,详见列表3。
在这个XMLParser.java应用程序中,首先,你要导入StAX类:
import javax.xml.stream.*; import
javax.xml.stream.events.*; import
javax.xml.stream.XMLInputFactory; | 然后,创建一个XMLInputFactory,由此你会得到一个XMLStreamReader:
| XMLInputFactory
inputFactory=XMLInputFactory.newInstance(); | 现在,你需要创建一个InputStream,作为一个输入流,它描述了将被分析的文件。另外,还要从前面创建的XMLInputFactory对象中创建一个XMLStreamReader。
InputStream input=new FileInputStream(new
File("C:/STAX/catalog.xml")); XMLStreamReader xmlStreamReader
=inputFactory.createXMLStreamReader(input); | 如果更多分析事件可用,hasNext()方法返回true。然后,使用next()方法获得下一个分析事件:
| int
event=xmlStreamReader.next(); | 比较于SAX分析,StAX分析的优点是,一个分析事件可以被跳过-通过调用next()方法,详见下面的代码。例如,如果分析事件类型为ENTITY_DECLARATION,那么开发者可以决定是要从当前事件中获得事件信息,还是检索下一个事件:
If(event.getEventType()==XMLStreamConstants.ENTITY_DECLARATION){
int
event=xmlStreamReader.next(); } | 通过不调用next()方法,分析也可以被推迟。next()方法返回int,它代表了一个分析事件-通过使用一个XMLStreamConstants常量指定。
XMLStreamReader所返回的不同的事件类型列举于表格1中。
| 事件类型 |
描述 |
| START_DOCUMENT |
一个文档的开始 |
| START_ELEMENT |
一个元素的开始 |
| ATTRIBUTE |
一个元素属性 |
| NAMESPACE |
一个命名空间声明 |
| CHARACTERS |
字符可以是文本,或是一个空格 |
| COMMENT |
一个注释 |
| SPACE |
可忽略的空格 |
| PROCESSING_INSTRUCTION |
处理指令 |
| DTD |
一个DTD |
| ENTITY_REFERENCE |
一个实体参考 |
| CDATA |
Cdata节 |
| END_ELEMENT |
结束元素 |
| END_DOCUMENT |
结束文档 |
| ENTITY_DECLARATION |
一个实体声明 |
| NOTATION_DECLARATION |
一个标志声明 | 表格1.XMLStreamReader事件
这些不同的分析事件能够使你获得XML文档中的数据和元数据。如果分析事件类型是START_DOCUMENT,那么你将使用getEncoding()方法获得XML文档中的指定编码,而你将使用getVersion()方法返回XML文档的XML版本。
同样,如果你在使用一个START_ELEMENT事件类型工作,那么你将使用getPrefix()方法来返回元素前缀并且使用getNamespaceURI来返回元素前缀命名空间或默认命名空间。为了获得元素的本地命名,你将使用getLocalName()方法并且使用getAttributesCount()方法获得属性数目。你将使用getAttributePrefix(i)方法得到一个指定的属性索引i的属性前缀,而使用getAttributeNamespace(i)方法取得属性命名空间。使用getAttributeLocalName(i)方法获得属性本地命名,使用getAttributeValue(i)方法获得属性值。如果事件类型是CHARACTERS或COMMENT,则使用getText()方法获得相应的文本。
列表4显示了示例XML文档,catalog.xml,的分析输出结果。
列表3显示了用于分析XML文档的Java应用程序。你可以从命令行上或在一种例如Eclipse这样的IDE中来运行该应用程序。记住:如果你没有首先运行XMLWriter.java应用程序而运行XMLParser.java(见源码中的列表2),那么你需要把catalog.xml(见源码中的列表1)复制到C:/StAX目录下。
|
|
|
|
|
|
|
|