2012-11-21 48 views
3

有沒有辦法在XML文件中查找編碼問題?我試圖用XML庫在R中解析這樣的文件(我們稱之爲doc),但似乎存在編碼問題。調試編碼問題(R XML)

xmlInternalTreeParse(doc, asText=TRUE) 
Error: Document labelled UTF-16 but has UTF-8 content. 
Error: Input is not proper UTF-8, indicate encoding! 
Error: Premature end of data in tag ... 

和標籤用的數據如下推測過早端的列表。但是,我敢肯定,這個文檔中不存在不成熟的目的。

好了,下一個嘗試:

doc <- iconv(doc, to="UTF-8") 
doc <- sub("utf-16", "utf-8", doc) 
xmlInternalTreeParse(doc, asText=T) 
Error: Premature end of data in tag... 

和標籤列表如下再次隨着行號。我檢查了這些行,但找不到任何錯誤。

另一種猜疑:文檔中出現的「μ」字符可能會導致錯誤。所以,下一次嘗試:

doc <- iconv(doc, to="UTF-8") 
doc <- gsub("µ", "micro", doc) 
doc <- sub("utf-16", "utf-8", doc) 
xmlInternalTreeParse(doc, asText=T) 
Error: Premature end of data in tag... 

用於調試任何其他建議?

編輯:花了兩天的時間嘗試修復錯誤後,我仍然沒有找到解決方案。不過,我想我已經縮小了可能的答案。以下是我發現:

  • 複製從源數據庫中的XML字符串轉換成一個文件並將其保存爲一個單獨的文件xml在記事本++ - >Document labelled UTF-16 but has UTF-8 content

  • 該文件內改變<?xml version="1.0" encoding="utf-16"?><?xml version="1.0" encoding="utf-8"?>(或encoding="latin1") - >沒有錯誤

  • 讀取從數據庫XML串經由doc <- sqlQuery(myconn, query.text, stringsAsFactors = FALSE); doc <- doc[1,1],與str_sub(doc, 35, 36) <- "8"str_sub(doc, 31, 36) <- "latin1"操縱它,然後試圖與xmlInternalTreeParse(doc)解析它 - >Premature end of data in tag...

  • 閱讀從數據庫中XML字符串作爲上面再試圖解析它的Wi th xmlInternalTreeParse(doc) - >Document labelled UTF-16 but has UTF-8 content. Input is not proper UTF-8, indicate encoding ! Bytes: 0xE4 0x64 0x2E 0x20 Premature end of data in tag...(標籤列表如下)。

  • 閱讀從數據庫中XML串如上和xmlInternalTreeParse(doc, encoding="latin1")與解析 - >Premature end of data in tag...

  • 使用doc <- iconv(doc[1,1], to="UTF-8")to="latin1"分析之前不會改變任何東西

我將不勝感激任何建議非常許多。

+0

這是非常難回答這種性質的問題,沒有一個可重複的例子 – hadley

+1

@hadley我不知道如何提供MWE在這裏。當我改變「UTF-16」至「UTF-8」,在文檔標題,然後這個文件的內容複製到另一個空文件並將其保存在完全相同的方式,'文檔標記UTF-16 ...'錯誤消失。更改原始文件中的標題並保存更改無效。但是我不能每次都使用這個過程,因爲我需要這個腳本來自動處理數據庫中的數據。我很困惑,不知道如何調試,甚至不知道如何提供一個例子,因爲它似乎不是導致問題的內容本身。 – AnjaM

+0

我知道我在幾個月前調試過類似的問題,但我記不起我做了什麼。您可以體驗的另一件事就是加載與'xmlInternalTreeParse(文件(文檔,編碼=「UTF-16」))'的XML,看看是否設置編碼有幫助。 – hadley

回答

3

出現編碼問題是因爲原始XML文件的編碼和XML數據存儲爲longtext的SQL數據庫中的編碼不匹配。代XML字符串內的編碼的說明書和轉換這個字符串解決了這個問題:從數據庫中檢索期間

doc <- sqlQuery(myconn, query.text, stringsAsFactors = FALSE) 
doc <- iconv(doc[1,1], to="UTF-8") 
doc <- sub("utf-16", "utf-8", doc) 
doc <- xmlInternalTreeParse(doc, asText = TRUE) 

截斷XML字符串的原來是一個單獨的問題。解決方案在這裏提供:How to retrieve a very long XML-string from an SQL database with R?