1

我有这样的字符串

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

实际上这是正确的 xml,除了 &、<、> 符号。

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

如何进行这种转换?

4

4 回答 4

7

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

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

于 2012-05-10T10:44:20.920 回答
2

这几乎不可能可靠地实现。您应该从源头纠正此问题。如果您控制插入“My test is > & <”字符串的系统,那么您应该在插入之前转义该字符串。HttpUtility.HtmlEncode是这样做的合理方式。

于 2012-05-10T10:38:04.303 回答
1

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

这就像您也可以使用 HTML 一样。

于 2012-05-10T10:39:26.630 回答
1

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

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

于 2012-05-10T11:27:20.343 回答