XElement.SetText 编码问题与单引号和双引号
本文关键字:单引号 SetText 编码 问题 XElement | 更新日期: 2023-09-27 18:32:34
关于我正在处理的应用程序,我对XElement类有一个非常具体的问题。
假设我尝试将元素值设置为"测试和测试更多<>">
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呈现时,它看起来像"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,但它没有成功。
任何关于解决这个问题的帮助将不胜感激。
谢谢!
表达式,因为对于 XPath 1.0,语法'
不被理解为转义的单引号。即使使用 XPath 2.0,您也需要遵循 XPath 2.0 语法约定来转义引号,这需要将引号加倍,例如 Test[.='some value with single quote''s ']
.
如果要保存 XDocument 或 XElement,并希望强制将单引号或双引号转义为实体引用,则正确的方法是扩展 XmlWriter 实现,确保根据需要转义每个引号。然后保存到自定义 XmlWriter 实现的实例。