2016-11-10 107 views
0

注意:這裏的主題中有無數的問題,但我找不到任何針對我的特定問題的問題。儘管編碼正確,但XML解析器不解析UTF-8

我正在從http://rss.cnn.com/rss/cnn_latest.rss解析XML,並且我的解析器工作得很好,我得到了我一直在尋找的所有東西。沒問題。然後突然間,工作幾個小時後,我就開始出現一些編碼錯誤。

現在,我一直在做的是將源XML寫入文件,然後解析該文件,如下所示。

File xmlfile = new File("cnnxml.txt"); 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 

DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(xmlfile); 

有什麼奇怪的是,這是XML文件的第一行,所以它似乎編碼是,事實上,UTF-8

<?xml version="1.0" encoding="UTF-8"?> 

下面是我得到的錯誤蝕。

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:Invalid byte 3 of 4-byte UTF-8 sequence. 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanCDATASection(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
at getRSS.main(getRSS.java:87) 

而且,再次,這是整天工作,然後完全從任何地方我開始出現問題。到底是怎麼回事?

+0

我有一個IOException嘗試抓住它,它仍然會產生此問題。當你說序列是在一個實體中時,你的意思是在每個單獨的項目中(在這種情況下,每個故事鏈接在RSS上)?這會給我的理論帶來一些可信度,無論出於何種原因,在我的編碼中增加了一些奇怪的東西,並破壞了曾經的工作。 – MPeal

+1

@JoopEggen你的評論應該是一個答案。 –

回答

0

您需要探索的解決方案。但@邁克爾凱建議,不太可能有更好的答案。

該文件聲明爲UTF-8,但不是。使用像JEdit或Notepad ++這樣的程序員編輯器來編碼。由於這是數據錯誤,因此發現異常,並將該文件複製到。它可能只是服務器的錯誤消息 - 那麼解決方案就是檢查響應狀態。注意:也許序列是在一個實體中 - 參見stacktrace。

我的反感是有些XML已損壞,所以try-catch應該對數據做些什麼:使用堆棧跟蹤或類似方法存儲它。如果它是可重複的,那麼最好。

這可能與數據涉及「無序」消息或某種邊界情況有關。

+0

感謝您的協助。事實證明,是的,頁面和生成的XML文件在那裏有一些非UTF-8內容並導致問題。然而,幾個小時後,這個頁面基本上已經完全重新填充了新的項目,問題解決了,而我不必改變任何東西。雖然我現在沒有理由嘗試,但我想也許您的解決方案和瑪納斯瑪吉的解決方案也可能有所幫助。謝謝! – MPeal

0

獲取文件的InputStream,使用指定的字符編碼將其轉換爲String(UTF-8)&解析來自字符串的InputSource。 示例代碼:

 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     String content = IOUtils.toString(xmlInputStream, "UTF-8"); 
     InputSource is = new InputSource(new StringReader(content)); 
     Document doc = dBuilder.parse(is); 
     doc.getDocumentElement().normalize();