由於項目的需要,將網站上的信息抓取下來,提取出想要的信息,然後保存在xml文件裏,再將xml文件上傳一服務器,這個過程中,我想將原來網頁上的信息的換行和空格標籤保存在xml文件裏去,但是直接將<br>標籤放在xml文件裏,顯然不行,因爲在xml文件裏會當作xml標籤,所以我就將<替換爲<而>就替換爲>這樣就可以與xml的標籤區分開來,但是空格 放在xml文件裏竟然有問題,xml解析它時會拋出如下異常:
org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared.
後來看了下面的文件後,就將 改爲  這樣可以讓xml解析器解析正確,在myeclipse下調試,看到的串顯示也是正確的,不過用System.out.println()打印出來會在有 的地方顯示三個問號,我再根據下面的文章,將這個串用replaceAll("\240$", " ")方法替換回空格,再存放數據庫,但是我這裏不行,還是顯示出三個問題,後來再查了一下,原來將 替換爲&nbsp;然後寫入xml文件,後面由xml解析器解析出來的就成了nbsp;也正是我想要的空格,可以直接放入數據庫中去。
參考:
奇怪的編碼,奇怪的顯示——一個關於 的故事
我們常常會解析html,解析html通常來說有兩種方法,其一是直接對html進行解析,其二是將html轉換到xml再解析。因爲學習成本的關係,越來越傾向於使用後者來實現。第二種方法一個常用的工具就是:neko html parser,他將html轉換到xml,又使用了Xerces2進行xml操作。
於是問題開始了,在html中的&符號表示的一些特別意義,在xml中往往沒有定義,比如今天我要講的 他在html中表示non-breaking space,但是你不能用同樣的方式在xml中表示,因爲xml中&開頭表示,可解析的實體,這個實體被DTD預先定義,而 並沒有被定義,所有如果用Xerces2來解析出現這樣字符的xml文件(當然,這裏假設你也沒有自己預先定義),會拋出如下異常:
org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared.
一般給出如下的解決方案:使用  這又是什麼道理呢?因爲這是HTML ISO-8859-1 Reference 定義的規範,如下:
Character Entity Number Entity Name Description
  non-breaking space
neko html parser也這是使用的這樣的方案,所以當解析這樣一句html的時候:
<td>
big black bear bit back the big black bug.
</td>
就bei neko html parser替換成了
<td>
big black bear bit back the big black bug. 
</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