C#仅从节点文本中转义非法xml字符

C#仅从节点文本中转义非法xml字符,c#,xml,C#,Xml,我正在使用一个API,由于某些疯狂的原因,返回的XML包含未正确转义的字符。这让我处于一个恼人的境地。当我尝试使用XMLDocument解析xml字符串时,会出现异常 我可以使用replace删除字符,但这可能会导致问题 xml = xml.Replace("&amp;", "&").Replace("&", "&amp;"); 问题是可能会有一些转义值。这样的节点会导致上面的代码行出错 <node>Something & something

我正在使用一个API,由于某些疯狂的原因,返回的XML包含未正确转义的字符。这让我处于一个恼人的境地。当我尝试使用
XMLDocument
解析xml字符串时,会出现异常

我可以使用replace删除字符,但这可能会导致问题

xml = xml.Replace("&amp;", "&").Replace("&", "&amp;");
问题是可能会有一些转义值。这样的节点会导致上面的代码行出错

<node>Something & something &lt; annoying</node>
有些东西&有些烦人的东西
如果我将&字符替换为amp;它将打破lt;。我不能对lt使用相同的方法;正如我对放大器所做的那样,这意味着它将转换我仍然需要转义的所有括号

这里有一个节点出现了问题

<CompanyName>Fire & Ice</CompanyName>
火与冰

我向您推荐XElement.XElement是有用的对象。XElement.Value将返回您想要的字符串

using System.Xml.Linq;
XElement y = new XElement("CompanyNames",
                new XElement("CompanyName", "Fire & Ice")
                );
foreach (var item in y.Elements("CompanyName"))
{
   Console.WriteLine(item.Value);
}  

输出为“Fire&Ice”

您可以使用类似的正则表达式。这基本上匹配所有未替换的符号(即,它将匹配
&
,但不匹配
&something;

var-xml=@“有些东西&有些烦人的东西”;
var result=Regex.Replace(xml,@“&(?!\w*)”,“&;”;
//输出:某物&;讨厌的事

您能发布一个错误XML的示例吗?我已经在示例中给出了一个示例。这就是我需要能够处理的xml。我提供了另一个我目前面临的问题的例子,替换(&),“&;”)怎么样?请让XML的创建者来解决它。这是唯一正确的方法。要么打电话给XMLTidy什么的。或者编写您自己的标记化分隔符并替换每个仅为&character的标记。如果XML无效,它将无法解析它。我看不出这有什么帮助。XElement可以解析无效的XML?@CharlesMager“解析EntityName时出错。第1行,位置18。”在上面的
示例中使用
XDocument.parse
。请添加一些与原始问题对应的代码示例或示例链接。这在所有情况下都不起作用。考虑这个和您好将不会被替换和放大器;hello@fahadash是的,会的。“反向前瞻”需要一个单词和分号,而
&hello
与之不匹配。@fahadash我不知道你在说什么。它是不匹配的负前瞻,因此它将被替换<代码>&hello将替换为
&;您好
。前者是无效的,所以这肯定是预期的吗?对不起,我的意思是说
&hello
(带分号),我们希望它是
&;你好,尽管您的解决方案非常接近,并且可能满足OP的要求+1@fahadash我说的不是字符,而是实体引用<代码>&你好
是有效的实体引用,DTD可以指定映射到的对象。有关一些示例,请参见。
var xml = @"<node>Something & something &lt; annoying</node>";

var result = Regex.Replace(xml, @"&(?!\w*;)", "&amp;");

// output: <node>Something &amp; something &lt; annoying</node>