XElement.SetText 编码问题与单引号和双引号

本文关键字:单引号 SetText 编码 问题 XElement | 更新日期: 2023-09-27 18:32:34

关于我正在处理的应用程序,我对XElement类有一个非常具体的问题。

假设我尝试将元素值设置为"测试和测试更多<>">

        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;
    }

调用 SetText 函数时,&quot;将变为&amp;quot;。因此,当HTML呈现时,它看起来像"quot;,当我真的想要显示"时。

我需要单引号编码的原因是,有一个服务可以在运行时创建 xpath 表达式。

即 - 服务创建的 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,但它没有成功。

任何关于解决这个问题的帮助将不胜感激。

谢谢!

XElement.SetText 编码问题与单引号和双引号

我不明白使用 XML 语法转义引号如何帮助 XPath 1.0

表达式,因为对于 XPath 1.0,语法&apos;不被理解为转义的单引号。即使使用 XPath 2.0,您也需要遵循 XPath 2.0 语法约定来转义引号,这需要将引号加倍,例如 Test[.='some value with single quote''s '] .

如果要保存 XDocument 或 XElement,并希望强制将单引号或双引号转义为实体引用,则正确的方法是扩展 XmlWriter 实现,确保根据需要转义每个引号。然后保存到自定义 XmlWriter 实现的实例。