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

时间:2012-04-26 22:23:29

标签: c# xml xpath encoding xelement

关于我正在处理的applciation,我对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呈现时,它看起来像&amp; 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,但它没有用完。

非常感谢任何有关解决此问题的帮助。

谢谢!

1 个答案:

答案 0 :(得分: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实现的实例。