2011-12-07 76 views
0

報告以下異常客戶端的機器上已經發生:XElement.Save導致XmlUtf8RawTextWriter拋出異常

System.ArgumentException: '', hexadecimal value 0x1F, is an invalid character. 
at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize) 
at System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd) 
at System.Xml.XmlUtf8RawTextWriter.WriteString(String text) 
at System.Xml.XmlUtf8RawTextWriterIndent.WriteString(String text) 
at System.Xml.XmlWellFormedWriter.WriteString(String text) 
at System.Xml.Linq.ElementWriter.WriteElement(XElement e) 
at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) 
at System.Xml.Linq.XElement.Save(XmlWriter writer) 
at System.Xml.Linq.XElement.Save(String fileName, SaveOptions options) 
at System.Xml.Linq.XElement.Save(String fileName) 

不幸的是,沒有提供更多的信息。

該錯誤有點令人費解。

0x1F是一個問號。如果某個元素或屬性的名稱中包含問號(這是非法的),則會在創建XElementXAttribute時使用無效名稱而不是保存到磁盤時引發異常。

XmlUtf8RawTextWriter類拋出異常,這是XElement內部使用我猜(應用程序沒有)。預計不能XElement自己處理編碼問題等?什麼可能導致它崩潰?它是一些操作系統或框架不兼容?

我知道我的問題比較模糊,但我必須對有限的信息進行操作。

我會很感激,如果有人能夠至少指出我正確的方向。我以前沒有看到過這樣的錯誤。

回答

2

U + 001F不是實際上問號 - 它是XML中不允許的控制字符(「信息分隔符」)。 (U + 003F是個問號。)

基本上,你的XElement中有一個無效字符,無法正確保存。目前還不清楚你從哪裏獲取數據,但這就是問題所在。您需要弄清楚如何處理不良數據 - 是否完全刪除它,以某種方式或其他方式逃脫它。

下面是一個簡短但完整的計劃,但將重現該問題,如果它可以幫助:

using System; 
using System.IO; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     var element = new XElement("foo", "\u001f"); 
     element.Save(new MemoryStream()); 
    } 
} 
+0

謝謝你的提示。但是'XElement'不會自動轉義需要轉義的字符(比如&符號等),還是將它們包裝在CDATA塊中?如何手動清理'XElement'的內容? –

+0

@Morawski:不 - 你不能直接用XML表示這些字符,甚至不能用CDATA來表示。爲了消毒,您需要編寫一個方法來檢查內容是否包含任何無效字符,如果是,則進行替換。 (一個正則表達式替換*可能最終會成爲最快的方法。)如果我是你的話,我會在它的XElement之前執行它。 –