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

时间:2016-06-28 09:03:40

标签: c# xml

我正在使用API​​,并且由于一些疯狂的原因,返回的XML已经&未正确转义的字符。这让我陷入了烦人的境地。当我尝试使用XMLDocument来解析xml字符串时,我收到异常。

我可以使用替换来摆脱角色,但这可能会导致问题。

xml = xml.Replace("&", "&").Replace("&", "&");

这个问题是最终可能会出现一些转义值。像这样的节点会导致上面的代码行被搞砸。

<node>Something & something &lt; annoying</node>

如果我更换&amp;带放大器的字符;它会破坏LT;。我不能使用相同的方法LT;正如我为放大器所做的那样,这意味着它将转换所有的&lt;&gt;括号,我仍然需要逃脱。

这是一个给出麻烦的节点。

<CompanyName>Fire & Ice</CompanyName>

2 个答案:

答案 0 :(得分:3)

您可以使用类似的正则表达式this related question。这非常匹配所有未转义的&符号(即它将匹配&,但不匹配&something;)。

var xml = @"<node>Something & something &lt; annoying</node>";

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

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

答案 1 :(得分:-1)

我向你推荐XElement.XElement是有用的object.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&amp; Ice”