提取html內容放入xml文件時空格問題

由於項目的需要,將網站上的信息抓取下來,提取出想要的信息,然後保存在xml文件裏,再將xml文件上傳一服務器,這個過程中,我想將原來網頁上的信息的換行和空格標籤保存在xml文件裏去,但是直接將<br>標籤放在xml文件裏,顯然不行,因爲在xml文件裏會當作xml標籤,所以我就將<替換爲&lt;而>就替換爲&gt;這樣就可以與xml的標籤區分開來,但是空格&nbsp;放在xml文件裏竟然有問題,xml解析它時會拋出如下異常:

org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared. 


 

後來看了下面的文件後,就將&nbsp;改爲&#160; 這樣可以讓xml解析器解析正確,在myeclipse下調試,看到的串顯示也是正確的,不過用System.out.println()打印出來會在有&#160;的地方顯示三個問號,我再根據下面的文章,將這個串用replaceAll("\240$", "&nbsp;")方法替換回空格,再存放數據庫,但是我這裏不行,還是顯示出三個問題,後來再查了一下,原來將&nbsp;替換爲&amp;nbsp;然後寫入xml文件,後面由xml解析器解析出來的就成了nbsp;也正是我想要的空格,可以直接放入數據庫中去。

 

 

參考:

奇怪的編碼,奇怪的顯示——一個關於&nbsp;的故事

我們常常會解析html,解析html通常來說有兩種方法,其一是直接對html進行解析,其二是將html轉換到xml再解析。因爲學習成本的關係,越來越傾向於使用後者來實現。第二種方法一個常用的工具就是:neko html parser,他將html轉換到xml,又使用了Xerces2進行xml操作。 

於是問題開始了,在html中的&符號表示的一些特別意義,在xml中往往沒有定義,比如今天我要講的&nbsp; 他在html中表示non-breaking space,但是你不能用同樣的方式在xml中表示,因爲xml中&開頭表示,可解析的實體,這個實體被DTD預先定義,而&nbsp;並沒有被定義,所有如果用Xerces2來解析出現這樣字符的xml文件(當然,這裏假設你也沒有自己預先定義),會拋出如下異常: 
org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared. 
一般給出如下的解決方案:使用&#160; 這又是什麼道理呢?因爲這是HTML ISO-8859-1 Reference 定義的規範,如下: 
Character Entity Number Entity Name Description 
           &#160;  &nbsp; non-breaking space 
neko html parser也這是使用的這樣的方案,所以當解析這樣一句html的時候: 
<td> 
    big black bear bit back the big black bug.&nbsp; 
</td> 

就bei neko html parser替換成了 

<td> 
    big black bear bit back the big black bug.&#160; 
</td> 

如果這樣就完了,就不會有今天這篇文章了。 
但是替換之後,通過xml解析輸出,顯示的不是一個空格而是一個 ?,最要人命的地方了是這個?並不是ascii 中的063d。所以當我們通過getTextContent()方法的時候,我們得到的是: 
big black bear bit back the big black bug.? 

在實際應用中,當然需要出去這個?,於是我們打算使用replaceAll("\\?$", "")來替換掉這個?,但是你錯了,你被你的眼睛騙了,這時你會發現根本不起作用你應該是用replaceAll("\240$", ""),240是160的八進制數。 

 

後記:

原來讓xml不解析大小於號等xml關鍵字符,可以用:

 

CDATA 部分中的所有內容都會被解析器忽略。

CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結束:

詳見:http://www.w3school.com.cn/xml/xml_cdata.asp

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章