XML——流机制解析器
【0】README
0.1) 本文文字描述轉(zhuǎn)自 core java volume 2 , 旨在理解 XML——流機(jī)制解析器 的基礎(chǔ)知識(shí) ;
0.2) for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728
【1】XML——流機(jī)制解析器概述
1)problem+solution
- 1.1)problem: 如果文檔很大,并且處理算法簡單,可以在運(yùn)行時(shí)解析節(jié)點(diǎn), 而不必看到完整的樹型結(jié)構(gòu), 那么DOM 解析器的執(zhí)行效率就低下 了;
- 1.2)solution: 在這種case 下, 我們應(yīng)該使用流機(jī)制解析器;(干貨——引入流機(jī)制解析器的原因)
2)java 提供的流機(jī)制解析器: SAX解析器和添加到Java 6 中的更現(xiàn)代化的 StAX 解析器。 SAX解析器使用的是事件回調(diào), 而StAX解析器提供了解析事件的迭代器;(干貨——java提供了SAX流機(jī)制解析器+StAX 解析器)
【2】使用SAX解析器 (干貨——DOM解析器是基于SAX解析器的)
1)SAX解析器在解析XML 輸入的組成部分時(shí)會(huì)報(bào)告事件, 但不會(huì)以任何方式存儲(chǔ)文檔,而是由事件處理器建立相應(yīng)的數(shù)據(jù)結(jié)構(gòu); (干貨——SAX解析器在解析XML 輸入的組成部分時(shí)會(huì)報(bào)告事件,即SAX解析器是基于事件的)
2)在使用SAX 解析器時(shí),需要一個(gè)處理器來為不同的解析器事件定義事件動(dòng)作,ContentHandler接口定義了若干個(gè)在解析文檔時(shí)解析器會(huì)調(diào)用的回調(diào)方法。 下面是最重要的幾個(gè):
- 2.1)startElement 和 endElement: 在每當(dāng)遇到起始或終止標(biāo)簽時(shí)調(diào)用;
- 2.2)characters :在每當(dāng)遇到字符數(shù)據(jù)事件調(diào)用;
- 2.3)startDocument 和 endDocument:分別在文檔開始和結(jié)束時(shí)各調(diào)用一次;
3)看個(gè)荔枝:解析以下片段時(shí),
<font><name>a</name><size units="pt">36</size> </font>3.1)解析器會(huì)產(chǎn)生以下調(diào)用:
- step1)startElement, 元素名: font
- step2)startElement, 元素名: name
- step3)characters, 內(nèi)容: a
- step4)endElement, 元素名: name
- step5)startElement, 元素名:size,屬性:units=“pt”
- step6)characters, 內(nèi)容: 36
- step7)endElement, 元素名: size
- step8)endElement, 元素名: font
3.2)處理器必須覆蓋以上方法, 讓它們執(zhí)行在解析文件時(shí)想要執(zhí)行的動(dòng)作;
Attention)
- A1) HTML不是合法的XML, 大多數(shù) HTML 頁面都與良構(gòu)的XML差別很大, 以至于示例程序無法解析它們;
- A2)但是,W3C 編寫的大部分頁面都是用 XHTML編寫的, XHTML 是一種 HTML方言,又是良構(gòu)的XML; (干貨——HTML不是合法的XML,而 XHTML 是一種 HTML方言,又是良構(gòu)的XML)
4)代碼分析:
- 4.1)下面是如何得到SAX 解析器的代碼: (干貨——如何創(chuàng)建SAX解析器)
- 4.2)現(xiàn)在可以處理文檔了:
- 4.3)這里的source 可以是一個(gè)文件, 一個(gè)URL 字符串或者是一個(gè)輸入流。Handler 屬于 DefaultHandler 的一個(gè)子類, DefaultHandler 類為以下四個(gè)接口定義了空的方法:
- 4.4)startElement 方法有3個(gè)描述元素名的參數(shù): 其中 qname 參數(shù)以 prefix:localname的形式報(bào)告限定名; 如果命名空間處理特性已經(jīng)打開, 那么 namespaceURI 和 lname 參數(shù)描述的就是 命名空間和 本地名(非限定)。
- 4.5)與DOM解析器一樣, 命名空間處理特性默認(rèn)是關(guān)閉 的, 可以調(diào)用工廠類的 setNamespaceAware 方法來激活命名空間處理特性:
- 4.6)我們還處理了另外一個(gè)常見的問題: (干貨——如果你不需要驗(yàn)證文件, 只需調(diào)用factory.setFeature方法)
- XHTML 文件總是以一個(gè)包含對(duì) DTD 引用的標(biāo)簽開頭, 解析器將加載這個(gè) DTD。 可以理解的是, W3C 肯定不樂意對(duì)諸如www.w3.org/TR/xhtml/DTD/xhtml-strict.dtd 這樣的文件提供千萬億次的下載。總有一天,他們會(huì)完全拒絕提供這些文件, 至今,它們還在并不情愿地提供DTD下載。如果你不需要驗(yàn)證文件, 只需調(diào)用: factory.setFeature(“http://apache.org/xml/features/nonvalidating/load-external-dtd“, false);
總結(jié)
以上是生活随笔為你收集整理的XML——流机制解析器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京住宿攻略 盘点北京住宿攻略
- 下一篇: XML—— XSL 转换