對於我正在開發的應用程序,XElement類有一個非常具體的問題。單引號和雙引號XElement.SetText編碼問題
說我嘗試設置元素的值改爲「測試&測試更多<>」
XElement tester = updatedElement.XPathSelectElement("Test");
tester.SetValue("test & testing more < >");
// outputs
//<Test>test & testing more < ></Test>
這是正確的,精細的,但因爲我工作的應用程序的限制,與我也需要編碼單引號和雙引號。
說我通過調用調用XElement.SetText()之前清理輸入。
XElement.SetText(stringValue.EscapeXml())
public static string EscapeXml(this string s)
{
string xml = s;
if (!string.IsNullOrEmpty(xml))
{
xml = xml.Replace("\"", """);
xml = xml.Replace("'", "'");
}
return xml;
}
的"
將變成&quot;
時的setText函數被調用。所以,當HTML呈現時,它看起來像&「,當我真的想"顯示。
我需要單引號編碼的原因是因爲有一個服務在運行時創建xpath表達式。
I.E. - 由服務創建的的xpath將等同於
XElemenet test = testParent.XPathSelectElement("Test[.='some value with single quote's ']")
單引號將導致在放作爲濾波器作爲XPath表達式時異常。您可能會說,「爲什麼我不能在構建過濾器時用'
替換單引號。」
我不能這樣做的原因是因爲有一些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,但它不工作了。
任何幫助解決這一問題將是非常讚賞。
謝謝!
難道你不能改變服務,以便他們正確地對待正確的XML嗎? – svick 2012-04-26 23:47:18
我不控制這些服務 – james31rock 2012-04-27 01:04:48