Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

3.6.2 使用StAX解析器

StAX解析器是一种“拉解析器(pull parser)”,与安装事件处理器不同,你只需使用下面这样的基本循环来迭代所有的事件:

例如,在解析下面的片断时

解析器将产生下面的事件:

1)START_ELEMENT,元素名:font

2)CHARACTERS,内容:空白字符

3)START_ELEMENT,元素名:name

4)CHARACTERS,内容:Helvetica

5)END_ELEMENT,元素名:name

6)CHARACTERS,内容:空白字符

7)START_ELEMENT,元素名:size

8)CHARACTERS,内容:36

9)END_ELEMENT,元素名:size

10)CHARACTERS,内容:空白字符

11)END_ELEMENT,元素名:font

要分析这些属性值,需要调用XMLStreamReader类中恰当的方法,例如:

它可以获取当前元素的units属性。

默认情况下,命名空间处理是启用的,你可以通过像下面这样修改工厂来使其无效:

程序清单3-9包含了用StAX解析器实现的网络爬虫程序。正如你所见,这段代码比等效的SAX代码要简短了许多,因为此时我们不必操心事件处理问题。

程序清单3-9 stax/StAXTest.java

javax.xml.stream.XMLInputFactory 6

·static XMLInputFactory newInstance()

返回XMLInputFactory类的一个实例。

·void setProperty(String name,Object value)

设置这个工厂的属性,或者在要设置的属性不支持设置成给定值时,抛出IllegalArgument Exception。Java SE的实现支持下列Boolean类型的属性:

·XMLStreamReader createXMLStreamReader(InputStream in)

·XMLStreamReader createXMLStreamReader(InputStream in,String characterEncoding)

·XMLStreamReader createXMLStreamReader(Reader in)

·XMLStreamReader createXMLStreamReader(Source in)

创建一个从给定的流、阅读器或JAXP源读入的解析器。

javax.xml.stream.XMLStreamReader 6

·boolean hasNext()

如果有另一个解析事件,则返回true。

·int next()

将解析器的状态设置为下一个解析事件,并返回下列常量之一:START_ELEMENT、END_ELEMENT、CHARACTERS、START_DOCUMENT、END_DOCUMENT、CDATA、COMMENT、SPACE(可忽略的空白字符)、PROCESSING_INSTRUCTION、ENTITY_REFERENCE、DTD。

·boolean isStartElement()

·boolean isEndElement()

·boolean isCharacters()

·boolean isWhiteSpace()

如果当前事件是一个开始元素、结束元素、字符数据或空白字符,则返回true。

·QName getName()

·String getLocalName()

获取在START_ELEMENT或END_ELEMENT事件中的元素的名字。

·String getText()

返回一个CHARACTERS、COMMENT或CDATA事件中的字符,或一个ENTITY_REFERENCE的替换值,或者一个DTD的内部子集。

·int getAttributeCount()

·QName getAttributeName(int index)

·String getAttributeLocalName(int index)

·String getAttributeValue(int index)

如果当前事件是START_ELEMENT,则获取属性数量和属性的名字与值。

·String getAttributeValue(String namespaceURI,String name)

如果当前事件是START_ELEMENT,则获取具有给定名称的属性的值。如果namespaceURI为null,则不检查名字空间。