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

本文关键字:非法 xml 字符 转义 节点 文本 | 更新日期: 2023-09-27 17:52:47

我正在使用一个API,由于一些疯狂的原因返回的XML有&没有正确转义的字符。这让我陷入了一个令人烦恼的境地。当我尝试使用XMLDocument来解析xml字符串时,我会得到一个异常。

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

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

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

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

如果我替换&带有amp的字符;它会破坏它。我不能对它用同样的方法;就像我对amp所做的那样,这意味着它将转换我仍然需要转义的所有<>括号。

这是一个有问题的节点。

<CompanyName>Fire & Ice</CompanyName>

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

您可以使用类似的正则表达式来回答这个相关问题。这基本上匹配所有未转义的&号(即它将匹配&,但不匹配&something;)。

var xml = @"<node>Something & something &lt; annoying</node>";
var result = Regex.Replace(xml, @"&(?!'w*;)", "&amp;");
// output: <node>Something &amp; something &lt; annoying</node>

我向您推荐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 &冰"