2012-03-09 49 views
0

產生了如何使用由窗口生成的C#讀取XML二進制數據¬()C#讀取XML二進制數據¬()。 我正試圖訪問Windows註冊表中的註冊表項列表。 在字符串值中彈出二進制數據。我能夠使用xml序列化將其序列化爲(&#x2),但我無法將其反序列化? 任何人都可以解釋我發生了什麼問題,爲什麼?幫我解決這個問題。 非常感謝:))) 錯誤而讀取是:如何使用由窗口

System.InvalidOperationException了未處理
消息= 「有XML文檔(235,28)中的錯誤」。 從文件中讀取:

public diagnostics readregkey(diagnostics diagnostics, string filename) 
{ 
    diagnostics dia = null; 
    using (System.IO.StreamReader sr = 
     new System.IO.StreamReader(filename, Encoding.Unicode)) 
    { 
     System.Xml.Serialization.XmlSerializer x = 
      new System.Xml.Serialization.XmlSerializer(typeof(diagnostics)); 
     dia = x.Deserialize(sr) as diagnostics; 
    } 
    return dia; 
} 

寫入文件:

public static void WriteRegKey(diagnostics diagnostics, string filename) 
{ 
    diagnostic.regKeys.Add(key(Registry.LocalMachine, sKeyGravitas)); 
    diagnostic.regKeys.Add(key(Registry.CurrentUser, sKeyGravitas)); 
    using (System.IO.StreamWriter sw = 
     new System.IO.StreamWriter(filename,false, Encoding.Unicode)) 
    { 
     System.Xml.Serialization.XmlSerializer x = 
      new System.Xml.Serialization.XmlSerializer(typeof(diagnostics)); 
     x.Serialize(sw, diagnostics); 
    } 
} 
+0

有任何示例代碼/錯誤消息,你可以用它來幫助你? – GrandMasterFlush 2012-03-09 14:27:08

+0

向我們顯示您的序列化出來的確切代碼,然後再回來嗎?這似乎不是一個孤立的問題:http://marc.info/?l=xalan-dev&m=98865838020552&w=2 – JTeagle 2012-03-09 14:30:23

+0

是不是這樣的你的其他問題,http://stackoverflow.com/questions/9631122/how-to-read-and-write-in-xml? – 2012-03-09 15:15:06

回答

2

XML文件不能代表每一個字符,即使使用&#x;符號。

http://www.w3.org/TR/REC-xml/#charsets參見

XML 1.1,它沒有被廣泛使用,可支持除NUL所有字符。

但爲0x0002,表示它在XML 根本不是正確的格式。

處理嵌入二進制數據的常用方法是將它轉化成基本64。

0

我也有這個問題,爲了幫助下一個,我離開這裏,我用什麼來解決這個問題。

正如lavinio說,XML不能代表每個字符。因此,使用他提供的表我寫了一個方法,與另一個問題中的另一個答案非常相似:https://stackoverflow.com/a/641632/2315604,這是我在序列化之前調用的。

private string XmlCharWhiteList(string p) 
{ 
     StringBuilder stringBuilder = new StringBuilder(); 
     foreach(char c in p) 
     { 
      if (c == 0x0009 || c == 0x000A || c == 0x000D || 
       (c >= 0x0020 && c <= 0xD7FF) || 
       (c >= 0xE000 && c <= 0xFFFD)) 
       stringBuilder.Append(c); 
      else 
       stringBuilder.Append(' '); 
     } 
     return stringBuilder.ToString(); 
} 

而且,因爲.NET 4.0中,你可以使用XmlConvert.IsXmlCharhttps://msdn.microsoft.com/en-us/library/system.xml.xmlconvert.isxmlchar%28v=vs.110%29.aspx