2012-03-30 92 views
4

我有一個用XML屬性修飾的類,例如[XmlAttribute(「att」)]。我的目標是用這個類的xml創建一個XDocument。除了偶爾從外部進入場景的'0x1f'字符之外,一切都很好。所以很自然我試圖取代它,像這樣:String.Replace似乎沒有替換十六進制字符

XmlSerializer serializer = new XmlSerializer(this.GetType()); 
StringWriter sw = new StringWriter(); 
serializer.Serialize(sw, this); 
string s = sw.ToString(); 
s = s.Replace((char)0x1F, ' '); 
XDocument xs = XDocument.Parse(s); 
return xs; 

但是我仍然得到一個錯誤:「」」,十六進制值0x1F的,是無效的字符。」

只是爲了進行仔細的檢查,這裏是截圖: http://i.imgur.com/jZRWg.png

任何想法,我可以去錯了嗎?

+3

,並試圖找到如何'「0x1F的」性格偶爾進入現場externally' – 2012-03-30 20:25:14

+0

@LB,這些字符串與0x1F的從Web服務調用,這不是我的代碼(即外部檢索我的代碼庫)。即使我將字符串替換爲服務調用中的冒犯角色,但它似乎仍然存在! – b9190db9 2012-03-30 20:26:58

+0

@ L.B,感謝您的鏈接。我將確保接受的答案得到標記。我只能通過一個小型移動屏幕訪問互聯網,所以我違反了公約並不立即對我顯而易見:P – b9190db9 2012-04-02 14:06:11

回答

2

如果將它表示爲實體,您將得到相同的回覆 - 也許這就是發生了什麼?可以肯定地看s

樣品:

using System; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     string xml = "<foo>&#31;</foo>"; 
     XDocument.Parse(xml); 
    } 
} 
+0

您的建議是添加以下行:s.Replace(「」,string.Empty); 不幸的是我得到了同樣的錯誤。 – b9190db9 2012-03-30 20:42:06

+0

@ b9190db9:那麼我的第一個建議是*看看那個字符串*。在調試器中放置一個斷點,或將它記錄在某處 - 無論如何仔細查看它。找出壞字符正在採取什麼形式... – 2012-03-30 20:43:00

+0

我可以設置一個條件斷點,我正在尋找「0x1F」,並且程序成功中斷。然後我像上面寫的那樣調用string.replace,並設置另一個也打破的條件斷點。將字符串複製/粘貼到Notepad ++之類的東西並不會像我期望的那樣顯示字符。我無法篩選出這種奇怪的想法:P – b9190db9 2012-03-30 20:49:04

2

字符x1F的不是XML 1.0合法的。所以XML解析器會拒絕它。它在XML 1.1中是合法的,只要它是以一種&#x1f;的格式編寫的 - 但不是每個人都支持XML 1.1。最好的辦法是弄清楚這個角色進入系統的位置,並在源頭停止它。

1

對我而言,如果您嘗試使用字符串替換字符而不是字符,則會出現一些問題。我建議使用兩者來測試一些測試值,看看它們出現了什麼。另外你如何引用它有一些影響。

var a = x.IndexOf('\u001f');      // 513 
var b = x.IndexOf(Convert.ToString((byte)0x1F)); // -1 
x = x.Replace(Convert.ToChar((byte)0x1F), ' '); // Works 
x = x.Replace(Convert.ToString((byte)0x1F), " "); // Fails 

I blagged this

相關問題