1

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

假设我尝试将元素值设置为“test & testing more < >”

        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 时,它看起来像“,当我真的想要显示”时。

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

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

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

谢谢!

4

1 回答 1

2

我看不出使用 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 实现的实例。

于 2012-04-27T09:48:41.023 回答