关于我正在处理的applciation,我对XElement类有一个非常具体的问题。
假设我尝试将元素值设置为“test& testing more<>”
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;
}
调用SetText函数时,"
将变为&quot;
。因此,当HTML呈现时,它看起来像&amp; quot;,当我真的想要“显示。”
我需要编码单引号的原因是因为有一个服务在运行时创建了xpath表达式。
即。 - 服务创建的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,但它没有用完。
非常感谢任何有关解决此问题的帮助。
谢谢!
答案 0 :(得分:2)
我不知道使用XML语法转义引号如何帮助XPath 1.0表达式与XPath 1.0一样,语法'
不被理解为转义单引号。即使使用XPath 2.0,您仍需要遵循XPath 2.0语法约定来转义引号,这需要加倍引用,例如Test[.='some value with single quote''s ']
。
如果要保存XDocument或XElement并希望强制将单引号或双引号作为实体引用进行转义,那么正确的方法是扩展XmlWriter实现,以确保根据需要转义每个引号。然后保存到自定义XmlWriter实现的实例。