2017-04-21 200 views
0

我正在使用XmlDocument.Load加載具有泰語中的某些字符的XML文件的內容。應用程序出錯,出現以下異常。System.Xml.XmlException:給定編碼中的字符無效

System.Xml.XmlException:給定編碼中的字符無效。在System.Xml.XmlTextReaderImpl.GetChars(的Int32 maxCharsCount 線2,位置82處System.Xml.XmlTextReaderImpl.Throw(例外五) 在System.Xml.XmlTextReaderImpl.InvalidCharRecovery(的Int32 & bytesCount, 的Int32 & charsCount) )在System.Xml.XmlTextReaderImpl.ReadData()在 System.Xml.XmlTextReaderImpl.ParseText(的Int32 & startPos,的Int32 & endPos, 的Int32 & outOrChars)在 System.Xml.XmlTextReaderImpl.FinishPartialValue()在 的System.Xml .XmlTextReaderImpl.get_Value()at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)at System.Xml.XmlLoader.LoadDocSequence(XmlDocument的parentDoc)在 System.Xml.XmlDocument.Load(XmlReader中讀取)

XML文件與此內容開始 enter image description here

通知怪字符閉幕前標籤。此內容來自第三方,我無權訪問文件/內容。

我的問題是:

  1. 爲什麼出現在內容的怪字符從第三方提供商發送到我的 ?
  2. 有沒有什麼辦法可以成功地處理文件(加載到XmlDocument中) ,因爲我沒有 在處理它之前修改它的內容?
+1

使用XmlReaderSettings.CheckCharacters = false。但更好 - 聯繫第三方,並要求他們解決一個問題,因爲它似乎是無效的XML。 – Evk

+0

唯一有用的建議是開始檢查工作部分SO ...如果您無法與第三方合作以確保它們返回有效的XML,那麼您將被完全卡住,因爲您無法正確重建文檔(您怎麼知道文檔中還有哪些不正確的內容?)的確,您可以搜索數以千計的現有「讀取無效的XML」的問題 - 也許你會在那裏找到一些靈感...就像使用HTMLAgilityPack來讀取文本,或者從流中手動刪除無效的UTF8字節... –

+0

確保它確實是第三方的問題,文件是不會被自己破壞(例如通過讀取錯誤的非UTF-8編碼。 – Evk

回答

0

由第三方提供的數據是無效的XML。我認爲只有兩種解決方案,即讓第三方提供有效的XML或從XML中除去無效字符並處理您的可能內容。你可以這樣做......

string invalidXML = File.ReadAllText(path); 
var validXml = invalidXML.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray() 
if (validXml != invalidXML) 
    // log the invalid 

// process (what you can in) the validXml 
0

如果你非常確信,他們是泰國的字符,然後嘗試加載正確的數據編碼。

對於泰國的字符編碼 - ISO 8859-11

所以,請你嘗試下面的文檔加載方式:

xmlDoc.Load(new StreamReader(File.Open("YourXMLFile.xml"), 
         Encoding.GetEncoding("iso-8859-11"))); 

答到的第一個問題,你可能需要跟第三方,並要求他們查看他們的源代碼,找出爲什麼這些不需要的字符出現在生成的XML中。