2010-08-23 60 views
3

比方說,我有以下XML:如何使用.NET的XML庫允許(或替換)&符號?

<someRootElement> 
    <someTagWithUrl>http://www.google.com/s.php&test=testing</someTagWithUrl> 
</someRootElement> 

的someTagWithUrl內的符號是無效的,需要(通過使用&amp;)進行轉義,但假設我有與整個上述內容單一字符串。

我該如何安全地轉義&符號,使其成爲有效的XML? .NET的XML庫可以忽略這個嗎? (目前XElement.Parse會拋出異常)

我想過使用正則表達式來搜索標籤之間的符號,但我無法完全正確地獲取語法。 (類似>(\ &)\ <作爲正則表達式替換使用&,但我無法弄清楚)。

回答

2

外匹配連字號嘗試此正則表達式:

&(?!quot;|apos;|amp;|lt;|gt;#x?.*?;) 

這會發現在你的文字只有無效獨立&字符(那些不是實體的一部分)。下面是你會如何處理源數據作爲XML之前做的文本替換示例:

var regex = new Regex("&(?!quot;|apos;|amp;|lt;|gt;#x?.*?;)"); 
string fixedXml = regex.Replace(input, "&amp;"); 
+0

謝謝!只能找到標籤之間的&符號? (例如,一個相對安全的替代?) – SofaKng 2010-08-24 01:45:01

+0

它應該沒關係。當它們不描述實體時,&符號總是無效的,並且它們不允許在標籤內部,無論是作爲元素名稱,屬性名稱還是屬性值。你可能遇到的唯一問題是如果'CDATA'部分在你的XML中;如果是這樣的話,解決方案將更加複雜。 – Jacob 2010-08-24 02:16:36

2

你粘貼的內容是無效的XML,任何嘗試用XML庫解析它都會失敗。確保正確轉義的最佳方法是使用XML/HTML編寫器來創建數據。例如XmlWriter。他們將確保所有字符串正確逃脫。

+0

不幸的是,我已經解析XML編寫的,所以如果我想使用它,我需要解決這個問題。我知道這是無效的XML,但我仍然需要使用它... – SofaKng 2010-08-24 00:21:31

+0

@SofaKing如果是這樣的話,那麼你是在一個非常艱難的地方。您可能需要用'&'做一些不安全的'&'字符替換,並盡力避免CData部分。不幸的是,我沒有看到另一種方法,因爲你試圖用標準解析器解析非標準的XML。 – JaredPar 2010-08-24 00:28:29

+0

幸運的是,我不必處理CData,所以我想它不應該那麼糟糕? – SofaKng 2010-08-24 01:44:01

1

像這樣的正則表達式會得到你的標籤

 

>[^<]*(&)[^<]*< 
 
+1

-1:這將如何幫助? – 2010-08-24 00:13:13

+0

看起來像那樣會工作。你能告訴我什麼.NET函數調用看起來像使用它? (例如RegEx.Replace(myString,「> [^ <] *(&)[^ <] * <」,「&」)或類似的東西?) – SofaKng 2010-08-24 00:21:52

相關問題