![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
3.6.2 使用StAX解析器
StAX解析器是一种“拉解析器(pull parser)”,与安装事件处理器不同,你只需使用下面这样的基本循环来迭代所有的事件:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/167-i.jpg?sign=1738831516-4qlugoGw2mHxJEBos8xwNaUsYcCcSn8c-0-e801ca223712ee015f5a8a7e95a004ad)
例如,在解析下面的片断时
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/167-2-i.jpg?sign=1738831516-bsdyytb4HYeAmb5pkzISrHitjhM0gACx-0-d66da638157adbc4909204135a88813b)
解析器将产生下面的事件:
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类中恰当的方法,例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/167-3-i.jpg?sign=1738831516-T5Ql5OCdRFMgnT9FbBEUHMoI6HaPvJTM-0-326b8d5a8644d3e3d3c8cc46340280a3)
它可以获取当前元素的units属性。
默认情况下,命名空间处理是启用的,你可以通过像下面这样修改工厂来使其无效:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/167-4-i.jpg?sign=1738831516-40n5kUtEacSRnr1ZrfLqX9LeEoJBzsz1-0-7612b22b6875125d0cd1ab9767b964cd)
程序清单3-9包含了用StAX解析器实现的网络爬虫程序。正如你所见,这段代码比等效的SAX代码要简短了许多,因为此时我们不必操心事件处理问题。
程序清单3-9 stax/StAXTest.java
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/167-5-i.jpg?sign=1738831516-Q5PqWwjQB9NnvGywtCcnX59tcZEnrWKi-0-8995ecfe97aba9d05364aabb644f2c29)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/168-i.jpg?sign=1738831516-KUunKT1SIEtuzfb0JLMODDTT9xIrEsgz-0-33212675306205fc30cb6f07c116d021)
javax.xml.stream.XMLInputFactory 6
·static XMLInputFactory newInstance()
返回XMLInputFactory类的一个实例。
·void setProperty(String name,Object value)
设置这个工厂的属性,或者在要设置的属性不支持设置成给定值时,抛出IllegalArgument Exception。Java SE的实现支持下列Boolean类型的属性:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/168-2-i.jpg?sign=1738831516-m0RgfyMcEBuhzSIDgbUg41DlygESHS4y-0-8f43bf28566ed1f16e487f30025e8e56)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/169-i.jpg?sign=1738831516-XY4FqZ59fGpoTp4PW57JWLYwxusjIwkD-0-b2cba70b16623b78551f09db22b13655)
·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,则不检查名字空间。