C# 如何更换所有&;amp<&燃气轮机;在解析到XElement之前是否在字符串中?

C# 如何更换所有&;amp<&燃气轮机;在解析到XElement之前是否在字符串中?,c#,xml,regex,xml-parsing,C#,Xml,Regex,Xml Parsing,我有这样的绳子 "<root><text>My test is > & < </text></root>" “我的测试是>&” 实际上,这是正确的xml,除了&,符号 我需要将其转换为我的测试是&&&&&

我有这样的绳子

"<root><text>My test is > & < </text></root>"
“我的测试是>&”
实际上,这是正确的xml,除了&,符号

我需要将其转换为
我的测试是&

如何进行这种转换?

这几乎不可能可靠地实现。您应该在源代码处更正此问题。如果您控制插入“My test is>&<”字符串的系统,则应在插入该字符串之前转义该字符串<代码>HttpUtility.HtmlEncode是一种合理的方法。

这几乎不可能可靠地实现。您应该在源代码处更正此问题。如果您控制插入“My test is>&<”字符串的系统,则应在插入该字符串之前转义该字符串
HttpUtility.HtmlEncode
是一种合理的方法。

不要用用户文本替换变量(这是XML注入-有缺陷,不安全)。用转义文本替换它们。下面是一个XML转义函数:


这与HTML也一样。

不要用用户文本替换变量(这是XML注入,有缺陷,不安全)。用转义文本替换它们。下面是一个XML转义函数:


这与HTML也一样。

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

LINQPad代码段:

var str = "<root><text>My test is > & < </text></root>";
var element = new XElement("element", str);
element.Dump();
var str=“我的测试是>&<”;
变量元素=新元素(“元素”,str);
元素Dump();
输出:

<element>&lt;root&gt;&lt;text&gt;My test is &gt; &amp; &lt; &lt;/text&gt;&lt;/root&gt;</element>
roottext我的测试是&/文本/根
编辑:我重新阅读了这个问题,并意识到这不会产生所需的输出


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

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

LINQPad代码段:

var str = "<root><text>My test is > & < </text></root>";
var element = new XElement("element", str);
element.Dump();
var str=“我的测试是>&<”;
变量元素=新元素(“元素”,str);
元素Dump();
输出:

<element>&lt;root&gt;&lt;text&gt;My test is &gt; &amp; &lt; &lt;/text&gt;&lt;/root&gt;</element>
roottext我的测试是&/文本/根
编辑:我重新阅读了这个问题,并意识到这不会产生所需的输出

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

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

为您的语言编写一个好的解析器非常耗时,尤其是因为需要进行大量的测试。编写一个测试不好的糟糕解析器可能相当容易,而这正是许多糟糕的程序员会做的。在这种情况下,一个好的软件工程师会认识到遵守标准的好处。

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


为您的语言编写一个好的解析器非常耗时,尤其是因为需要进行大量的测试。编写一个测试不好的糟糕解析器可能相当容易,而这正是许多糟糕的程序员会做的。在这种情况下,一个好的软件工程师会认识到遵守标准的好处。

字符串来自哪里?理想情况下,这应该是固定在源。。。这不是“正确的xml,除了”-它只是不是xml…它是来自数据库的xml,但我用来自用户的文本替换了一些变量。“Var_Name”变为“可以包含&<>和所有可能符号的用户文本”,因此在将用户文本插入其他有效的XML之前,请先对其进行更正。。。当你把它弄混的时候,你已经太迟了。绳子是从哪里来的?理想情况下,这应该是固定在源。。。这不是“正确的xml,除了”-它只是不是xml…它是来自数据库的xml,但我用来自用户的文本替换了一些变量。“Var_Name”变为“可以包含&<>和所有可能符号的用户文本”,因此在将用户文本插入其他有效的XML之前,请先对其进行更正。。。当你把事情搞混的时候,你已经太迟了。