2012-04-26 56 views
1

對於我正在開發的應用程序,XElement類有一個非常具體的問題。單引號和雙引號XElement.SetText編碼問題

說我嘗試設置元素的值改爲「測試&測試更多<>」

 XElement tester = updatedElement.XPathSelectElement("Test"); 
     tester.SetValue("test & testing more < >"); 

     // outputs 
     //<Test>test &amp; testing more &lt; &gt;</Test> 

這是正確的,精細的,但因爲我工作的應用程序的限制,與我也需要編碼單引號和雙引號。

說我通過調用調用XElement.SetText()之前清理輸入。

 XElement.SetText(stringValue.EscapeXml()) 

     public static string EscapeXml(this string s) 
    { 
     string xml = s; 
     if (!string.IsNullOrEmpty(xml)) 
     { 
      xml = xml.Replace("\"", "&quot;"); 
      xml = xml.Replace("'", "&apos;"); 
     } 
     return xml; 
    } 

&quot;將變成&amp;quot;時的setText函數被調用。所以,當HTML呈現時,它看起來像&「,當我真的想"顯示。

我需要單引號編碼的原因是因爲有一個服務在運行時創建xpath表達式。

I.E. - 由服務創建的的xpath將等同於

XElemenet test = testParent.XPathSelectElement("Test[.='some value with single quote's ']") 

單引號將導致在放作爲濾波器作爲XPath表達式時異常。您可能會說,「爲什麼我不能在構建過濾器時用&apos;替換單引號。」

我不能這樣做的原因是因爲有一些ID元素是基於具有與XML節點相同值的過濾器進行匹配的。該過濾器也不會返回該元素,因爲父級沒有與過濾的表達式匹配的任何內容。

雙引號會起作用,因爲我將大量的XML傳遞給服務,並且該服務會將傳遞的XML轉換爲另一種形式的XML。然後,該服務發送XML到返回另一種形式與許多屬性其他服務:

所以說,我在下面發:

<test>Some value from the original XML "123"<test/> // cannot encode here, must be done before hand 

我回來

<test value="Some value from the original XML "123""/> 

傳遞一個雙在評估答覆時,引用這將導致失敗。我不能簡單地將它編碼到服務中,因爲屬性中的值必須與我的原始元素完全匹配。

沒有人有XElement類將編碼「和」報價的擴展方法。我試圖重寫的setText,但它不工作了。

任何幫助解決這一問題將是非常讚賞。

謝謝!

+0

難道你不能改變服務,以便他們正確地對待正確的XML嗎? – svick 2012-04-26 23:47:18

+0

我不控制這些服務 – james31rock 2012-04-27 01:04:48

回答

2

我看不出使用XPath如何與XML語法轉義引號幫助1.0表達式,使用XPath 1.0語法&apos;不被理解爲一個轉義單引號,即使使用XPath 2.0你會需要遵循XPath 2.0語法約定來轉義引號,這將是必要的加倍報價,例如Test[.='some value with single quote''s ']

如果您想要保存XDocument或XElement,並且希望強制將單引號或雙引號作爲實體引用轉義,那麼正確的方法是擴展一個XmlWriter實現,以確保每個引號都可以根據需要進行轉義。然後保存到您的自定義XmlWriter實現的實例。