如何替换所有&,<,>在解析为XElement之前的字符串中?

时间:2012-05-10 10:31:27

标签: c# xml regex xml-parsing

我有这样的字符串

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

实际上这是正确的xml,除了&amp;,&lt;,&gt;符号。

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

如何进行此转换?

4 个答案:

答案 0 :(得分:7)

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

LINQPad片段:

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字符串基本上无效。如果你可以控制源,那么你应该在那里修复它。如果没有,就没有简单的方法来修复它。

答案 1 :(得分:2)

这几乎是不可能实现的。您应该在源头更正此问题。如果您控制插入“我的测试是&gt;&amp;&lt;”字符串的系统,那么您应该在插入之前转义此字符串。 HttpUtility.HtmlEncode是一种合理的方式。

答案 2 :(得分:1)

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

这就像你用HTML一样。

答案 3 :(得分:1)

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

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