【问题标题】:How to replace all &, <, > in string before parsing to XElement?如何在解析为XElement之前替换字符串中的所有&、<、>?
【发布时间】:2012-05-10 10:31:27
【问题描述】:

我有这样的字符串

"<root><text>My test is > & < </text></root>"

其实这是正确的xml,除了&、符号。

在使用 XElement.Parse(str); 转换之前,我需要将其转换为 &lt;root&gt;&lt;text&gt;My test is &amp;gt; &amp;amp; &amp;lt; &lt;/text&gt;&lt;/root&gt;

如何进行这种转换?

【问题讨论】:

  • 字符串从何而来?理想情况下,这应该在源头上修复...这不是“正确的 xml,除了”-它只是不是 XML...
  • 它来自数据库的 xml,但我用来自用户的文本替换了一些变量。 “Var_Name”变成“可以包含&和所有可能符号的用户文本
  • 因此,在将用户文本插入原本有效的 XML 之前,请先在用户文本中进行更正......当你把它弄混时,你已经太迟了。

标签: c# xml regex xml-parsing


【解决方案1】:

如果您使用new XElement 而不是XElement.Parse(),XElement 会自动转义文本:

LINQPad sn-p:

var str = "<root><text>My test is > & < </text></root>";
var element = new XElement("element", str);
element.Dump();

输出:

<element>&lt;root&gt;&lt;text&gt;My test is &gt; &amp; &lt; &lt;/text&gt;&lt;/root&gt;</element>

编辑:我只是重新阅读了这个问题,并意识到这不会产生所需的输出。

您遇到的问题是您传入的 XML 字符串根本上是无效的。如果你可以控制源,那么你应该在那里修复它。如果没有,则没有简单的方法可以修复它。

【讨论】:

    【解决方案2】:

    这几乎不可能可靠地实现。您应该从源头纠正此问题。如果您控制插入“My test is > & HttpUtility.HtmlEncode 是一种合理的做法。

    【讨论】:

      【解决方案3】:

      不要用用户文本替换变量(这是 XML 注入 - 有问题,不安全)。用转义文本替换它们。这是一个 XML 转义函数:http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx

      这就像使用 HTML 一样。

      【讨论】:

        【解决方案4】:

        这是“除 xyz 之外的 XML”的想法可能需要更仔细地研究。为了正确解决这个问题,您需要为您称为“XML 除外 xyz”的语言定义一个语法,然后您需要编写一个解析器来分析符合该语法的文档;此解析器的输出可以是输入的 XML 表示。这一切都是可行的。不容易,但可行。当然,使用像 XML 这样的标准的好处是您可以获得现成的解析器,而如果您发明自己的语法,那么您必须编写自己的解析器。

        为您的语言编写一个好的解析器非常耗时,尤其是因为需要进行大量测试。编写一个经过糟糕测试的糟糕解析器可能很容易,这就是许多糟糕的程序员会做的事情。在这种情况下,优秀的软件工程师会认识到符合标准的好处。

        【讨论】:

          猜你喜欢
          • 2021-08-26
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 1970-01-01
          相关资源
          最近更新 更多