【问题标题】:XElement.SetText encoding issue with single and double quotes带有单引号和双引号的 XElement.SetText 编码问题
【发布时间】:2012-04-26 22:23:29
【问题描述】:

关于我正在处理的应用程序,我对 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 函数时,&amp;amp;quot; 将变为 &amp;amp;quot;。因此,当呈现 HTML 时,它看起来像“,当我真的想显示”时。

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

I.E. - 服务创建的 xpath 将等同于

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

当作为过滤器作为 xpath 表达式放入时,单引号将导致异常。您可能会说,“为什么我不能在构建过滤器时将单引号替换为&amp;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,但它没有成功。

对于解决此问题的任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您不能更改服务以正确处理正确的 XML 吗?

标签: c# xml xpath encoding xelement


【解决方案1】:

我看不出使用 XML 语法转义引号对 XPath 1.0 表达式有什么帮助,就像 XPath 1.0 一样,语法 &amp;apos; 不被理解为转义单引号。即使使用 XPath 2.0,您也需要遵循 XPath 2.0 语法约定来转义引号,并且需要将引号加倍,例如Test[.='some value with single quote''s '].

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2011-01-03
    相关资源
    最近更新 更多