上個月,java 技術講師 Sam Pullara 向我演示了他最新的支持 Java 的電話 Nokia 6630。這個手機使用了全面的技術 —— 嵌入式 JVM、GPRS 和藍牙,但是它也遭遇了所有智能手機都苦惱的問題 —— 有限的屏幕實際使用區。有些 Web 站點支持基于手機的瀏覽器,而且嵌入式瀏覽器也試圖在小小的屏幕上有效地渲染頁面,但是,在電話屏幕上查看典型的 Web 頁面,就像要把一頭大象強行塞進車后座一樣(其中的每個參與者都會感到失望,包括您、車和大象)。Sam 構建了一個簡單的、優雅的解決方案,從他喜歡的 Web 站點上對數據進行屏幕搜集,然后把數據重新格式化,在小屏幕上顯示。
新方法 從 Html 文檔提取數據的方法有許多種,但是我真的很喜歡 Sam 采用的方法:既把 XQuery 當作屏幕搜集工具(從頁面中提取相當的數據),又把它當作樣式表工具(重新格式化數據,以便數據適應頁面,不需要進行頁面滾動)。只要少量基礎設施和一些非常簡單的 XQuery 表達式,就可以從大量數據源提取出相關數據 —— 例如交通、天氣和財務報價等,并在電話上完好地顯示數據。
我過去經常處于這種情況:對 HTML 頁面進行屏幕搜集對某些特定問題來說似乎是可行的方案,但是幾乎沒有用于屏幕搜集的 Java 工具包。有許多 HTML 解析工具,但它們通常缺少足夠的抽象能力(把屏幕搜集代碼弄得亂七八糟),大量不符合 HTML 規范的應用限制了它們,它們也無法處理那些結構可能隨時間發生變化的、動態生成的頁面。
為了彌補質量低下的 HTML 和豐富的 xml 處理工具之間的空白,首先要把 HTML 轉換成 XML。許多工具有助于完成這項工作;JTidy 工具包做得很好,可以使這項工作變得輕松一些。JTidy 的設計目標是讀入典型質量(即很糟)的 HTML 并輸出更整潔的結果(有選項可供選擇),它還提供了一個 DOM 接口,用來遍歷能夠發送給 XML 解析器的 HTML 文檔。清單 1 中的代碼將從 InputStream 中讀取 HTML 文檔,并生成文檔的 DOM 表示:
用這個簡單的轉換,就差不多能把每個 Web 頁面都當作 XML 文檔進行處理,還能用自己喜歡的任何 XML 工具(比如 SAX、XSL、XPath,等等)提取數據。雖然 XSL 可能是很明智的選擇(因為其設計目標就是為了從 XML 文檔中提取信息并轉換這些信息,以便顯示它們),但是假如不了解 XSL 的話,它的學習曲線就很難把握,即使是最簡單的 XSL 轉換也復雜得讓人心煩。XPath 是處理信息提取的一個好選擇 —— XSL 和 XQuery 都用它進行內容選擇,可以很輕易地使用 XPath 把需要的數據提取出來,然后對 HTML 進行格式化,但是 XQuery 會讓這項工具更加輕易。
XQuery:簡介
XQuery 的設計目標是從可能非常大的 XML 數據集中提取數據。輸入的數據集不必是 XML 文檔,雖然它可能是 XML 文檔,但是也可能是已經編入索引并保存在 XML 數據庫中的文檔集合,甚至是一組關系數據庫中的表。像 SQL 一樣,XQuery 包含從多個數據集中提取數據、匯總數據、聚合數據和連接數據的函數。
就像 jsp、asp 或 Velocity 這樣的表示性模板語言一樣,XQuery 把兩個域(表示域和計算域)中的元素組合成一種組合語法。結果,所有 XML 文檔都自動成為有效的 XQuery 表達式,并對自身進行評估。XQuery 還包含一些語言語句(language statement),例如“for”和“let”,它們可以與 XML 元素混合使用。