如何更换所有的&,<,>在解析来的XElement前字符串?(How to replac

2019-10-16 17:22发布

我有串这样的

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

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

我需要将其转换到<root><text>My test is &gt; &amp; &lt; </text></root> <root><text>My test is &gt; &amp; &lt; </text></root> <root><text>My test is &gt; &amp; &lt; </text></root>之前,我将其转换与XElement.Parse(STR);

如何使这种转换?

Answer 1:

这是近了,就不可能实现可靠。 你应该从源头上解决这个问题。 如果控制被插入系统的“我的测试是>&<”的字符串,那么你应该在插入之前逃离这个字符串。 HttpUtility.HtmlEncode是这样做的合理的方式。



Answer 2:

如果你使用的XElement会自动躲避文本new 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字符串是根本无效的。 如果你能控制源,那么你应该有解决它。 如果不是,有固定它没有简单的方法。



Answer 3:

不要更换与用户文本变量(这是XML注入 - 越野车,不安全)。 与逃脱的文本替换它们。 下面是一个XML逃生功能: http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx

这就像你将与HTML做到这一点。



Answer 4:

这是也许需要更多的仔细检查“除了XYZ XML”的想法。 要正确地解决这个问题,你需要定义你所说的“XML除了XYZ”的语言语法,然后你需要写一个分析器,用于分析符合该语法文件; 这种分析器的输出可以是输入的XML表示。 这是所有相当可行的。 不容易,但可行的。 当然,使用像XML标准的好处是,你可以得到一个解析器关闭的,现成的,而如果你创造你自己的语法,那么你必须写自己的解析器。

写作语言的好分析器是耗时所需的大量测试的不只是因为。 写一个糟糕的解析器,非常真实测试可能是很容易的,而这也正是很多不好的程序员会做。 在这种情况下,一个优秀的软件工程师将承认符合标准的好处。



文章来源: How to replace all &, <, > in string before parsing to XElement?