曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費(fèi)者
夠?qū)λ匦陆獯a,而不得不先把它作為字節(jié)流進(jìn)行編碼(如U T F - 8編碼所要求)。最好由解析器
直接處理字節(jié)流。(實(shí)際上關(guān)于是否希望在S A X里提供這種選擇還有一些爭論。但是它顯然很有
用處,它不完全符合X M L規(guī)范的精神,X M L規(guī)范嚴(yán)格定義了X M L文檔為字節(jié)序列。也許最好是
不把輸入字符流看作是一個X M L文檔,而是當(dāng)作一個經(jīng)過預(yù)處理的X M L文檔,該文檔已經(jīng)完成
了第一步處理,即字節(jié)的解碼。)
對于是使用字節(jié)流還是字符流,有一個值得注意的障礙:解析器無法解析源文檔中出現(xiàn)的
相對U R L。假設(shè)源文檔包含下面這樣一行:
166使用XML 高級編程
下載
到哪里去找b o o k s . d t d? X M L規(guī)范說明(事實(shí)上)應(yīng)該在和源文檔相同的目錄下,但是當(dāng)然
并沒有源文檔目錄,因?yàn)楫?dāng)開始解析時它是在內(nèi)存中。
S A X通過允許用字節(jié)流或字符流提交系統(tǒng)標(biāo)識(即U R L)避免了這種情況。這個U R L不是
用于讀取源文檔,而只是作為一個用以解析源文檔中出現(xiàn)的相對U R L的基礎(chǔ)。
2. 指定文件名而不是U R L
另一個常見的輸入源是文件名:例如,命令行接口一般使用文件名而不是U R L作為輸入?yún)?br />
數(shù),而且你可能想在應(yīng)用程序接口中也使用這種形式的參數(shù)。
SAX InputSource類不直接支持為輸入指定一個文件名;你必須把文件名轉(zhuǎn)換成U R L以使解
析器能夠處理它。如果使用Java 2 就簡單了: Java File 類有一個相配的方法。要解析文件
c : \ s a m p l e . x m l,你可以寫這樣的語句:
(注意parse( )方法要求U R L是一個字符串而不是一個Java URL對象,因此需要調(diào)用toString( )實(shí)
現(xiàn)這種轉(zhuǎn)換。)
對于Java 1.1,如果想讓代碼能夠同時在Wi n d o w s和U N I X上運(yùn)行,那么把文件名轉(zhuǎn)換成U R L
就要比想象中的稍微困難一點(diǎn),因?yàn)橛泻芏喾N文件名格式。下面的方法能夠處理絕大多數(shù)格式,
盡管錯誤處理還不完善:
程序清單6 - 1 5
3. 非X M L輸入源
S A X使用的更令人驚奇的一種輸入方式是把根本不是X M L形式的數(shù)據(jù)提交給應(yīng)用程序。只
要數(shù)據(jù)是分層格式并可以被合理地映射到X M L數(shù)據(jù)模型,你就可以編寫一個各種操作類似X M L
解析器的驅(qū)動程序。驅(qū)動程序發(fā)送如startElement( ) 和endElement( ) 的事件給應(yīng)用程序的
D o c u m e n t H a n d l e r,就像數(shù)據(jù)是來源于一個X M L文檔,實(shí)際上并不存在一個要解析的X M L文檔。
為什么要這樣做?它可以利用為接收X M L數(shù)據(jù)而編寫的應(yīng)用程序,而不經(jīng)過先以X M L格式
編寫數(shù)據(jù)然后再進(jìn)行解析這種笨拙的處理過程。例如,如果有一個應(yīng)用程序,程序是為處理電
第6章SAX 1.0: XML簡易API使用167 下載
子商務(wù)的輸入X M L - E D I消息而設(shè)計(jì)的,你也許就想編寫一個轉(zhuǎn)換程序,能夠把比較老的專有格
式的消息提交給應(yīng)用程序處理。轉(zhuǎn)換程序的一種實(shí)現(xiàn)方法是創(chuàng)建一個X M L文件然后把文件提交
給應(yīng)用程序。但是如果目標(biāo)應(yīng)用程序是為使用S A X編寫的,有一個巧妙的簡便方法,就是轉(zhuǎn)換
程序假裝是一個X M L解析器去直接調(diào)用應(yīng)用程序。
下面關(guān)于S A X過濾器的章節(jié)將討論使用這種方法的可能性。
6.3.2 處理外部實(shí)體
人們經(jīng)常把在文檔文本中出現(xiàn)的像& a u m l a u t ;形式的標(biāo)志看作X M L實(shí)體。這并不完全準(zhǔn)
確:& a u m l a u t ;嚴(yán)格來說不是一個實(shí)體,而是一個實(shí)體參照。實(shí)體是& a u m l a u t ;所應(yīng)用的對象,這
就是D T D中的定義,此定義把“ a u m l a u t”和它的擴(kuò)展文本“ ä”聯(lián)系起來。
在X M L中有許多不同種類的實(shí)體,要非常謹(jǐn)慎地明確我們討論的是哪種實(shí)體。如第3章中所
提到的,包括表6 - 3所列各項(xiàng)。
表6 - 3
實(shí)體描述
字符引用( Character references) 以數(shù)值編碼(十進(jìn)制或十六進(jìn)制)指定的字符,如& # x a ;
或& # 1 0 ;(這些并不是嚴(yán)格意義上的實(shí)體,為了完備性,在
此處包含這種情況)
預(yù)定義實(shí)體( Predefined entities) X M L標(biāo)準(zhǔn)中定義的特殊的實(shí)體參照,如& l t ;和& a m p ;只是
唯一一種不需要在D T D中有相應(yīng)定義(內(nèi)部或外部)而使用
的實(shí)體參照
內(nèi)部實(shí)體( Internal entities) 其擴(kuò)展文本在D T D中定義(不作為對一些外部存儲對象的
引用)
外部解析實(shí)體(External parsed entities) 其擴(kuò)展文本是在一個獨(dú)立文件中定義的完備的X M L形式,
該文件是從主X M L文檔通過系統(tǒng)標(biāo)識或U R L引用的
非解析實(shí)體( Unparsed entities) 包括非X M L數(shù)據(jù)(例如二進(jìn)制編碼圖像):總是外部的。
真正的格式可以是以符號形式標(biāo)識
參數(shù)實(shí)體( Parameter entities) 包括D T D而不是文檔主體的組成部分
文檔實(shí)體( Document entity) 主源X M L文檔本身就是一個實(shí)體
外部文件類型定義( External DTD) 如果文檔應(yīng)用了一個外部D T D,那么D T D也是一個實(shí)體
S A X中處理實(shí)體的功能關(guān)注于解析對外部實(shí)體的引用,外部實(shí)體即存放于不同“文件”中
的數(shù)據(jù)—更嚴(yán)格地說,是存放于被系統(tǒng)標(biāo)識或公共標(biāo)識識別的容器中。內(nèi)部實(shí)體、字符引用
和預(yù)定義實(shí)體被解析器直接處理,應(yīng)用程序不能干預(yù)它們擴(kuò)展的方式。
X M L中的外部實(shí)體總是由一個系統(tǒng)標(biāo)識來識別(一個U R L或更實(shí)際的類似于U R L的東西),
或者也可以是由一個公共標(biāo)識來識別。公共標(biāo)識為S G M L預(yù)先考慮:盡管基于已經(jīng)建立的S G M L
慣例有一些約定,XML 標(biāo)準(zhǔn)(S A X同樣如此)并不真正說明公共標(biāo)識用來做什么和應(yīng)該如何使
用。
很多情況下,通過解釋系統(tǒng)標(biāo)識或U R L來解析外部實(shí)體引用的標(biāo)準(zhǔn)規(guī)則實(shí)際上是不夠的。
這些情況包括:
• 當(dāng)實(shí)體存放在數(shù)據(jù)庫中(或任何其他不能直接被U R L尋址的地方,例如字處理系統(tǒng)中的短
168使用XML 高級編程
下載
語庫)。
• 當(dāng)同一個實(shí)體引用根據(jù)上下文被分別解析。例如, & c u r r e n t U s e r ;實(shí)體引用可能被擴(kuò)展為當(dāng)
前登錄用戶的名字。
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(63)