官术网_书友最值得收藏!

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,則不檢查名字空間。

主站蜘蛛池模板: 法库县| 邯郸市| 峡江县| 平凉市| 北宁市| 许昌县| 边坝县| 海安县| 工布江达县| 海南省| 拜城县| 德昌县| 比如县| 比如县| 元阳县| 同心县| 安塞县| 伊宁县| 临沧市| 陕西省| 郴州市| 新晃| 潞西市| 永靖县| 合阳县| 博客| 剑河县| 革吉县| 封开县| 微山县| 鞍山市| 晴隆县| 长泰县| 华宁县| 高尔夫| 福建省| 呈贡县| 林西县| 大渡口区| 霞浦县| 成安县|