【问题标题】:C# Escape illegal xml characters from node text onlyC# 仅从节点文本中转义非法 xml 字符
【发布时间】:2016-10-30 12:20:06
【问题描述】:

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

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

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

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

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

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

这是一个有问题的节点。

<CompanyName>Fire & Ice</CompanyName>

【问题讨论】:

  • 您能否发布错误 XML 的示例?
  • 我已经在 示例中给出了一个示例。这是我需要能够处理的 xml。我提供了另一个我目前面临的问题的例子
  • Replace(" & ", "&") 怎么样?
  • 请请求该 XML 的创建者修复它。这是正确的唯一方法。
  • 要么你必须调用 XMLTidy 或其他东西。或者编写您自己的标记化分隔符并替换每个只是 & 字符的标记。

标签: c# xml


【解决方案1】:

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

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

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

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

【讨论】:

  • 这并不适用于所有场景。考虑这个 &hello 不会被 &hello
  • @fahadash 是的,它会的。否定前瞻需要一个单词和一个分号,而&amp;amp;hello 不匹配。
  • @fahadash 我不确定你在说什么。未匹配的是 negative 前瞻,因此它 被替换。 &amp;amp;hello 将替换为 &amp;amp;hello。前者是无效的,所以这肯定是预期的吗?
  • 对不起,我的意思是说&amp;amp;hello;(带分号),我们确实希望它是&amp;amp;hello;,尽管您的解决方案非常接近并且可能足以满足 OP。 +1
  • @fahadash 我说的不是字符,我说的是实体引用&amp;amp;hello; 是一个有效的实体引用,DTD 可以指定映射到什么。有关示例,请参阅this
【解决方案2】:

我向你推荐 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);
}  

输出将是“火与冰”

【讨论】:

  • 如果 XML 无效,它将无法解析。我不明白这有什么帮助。
  • XElement 可以解析无效的 XML 吗?
  • @CharlesMager "解析 EntityName 时出错。第 1 行,位置 18。"在上面的&lt;node&gt; 示例中使用XDocument.Parse 时。
  • 请添加一些代码示例或与原始问题对应的示例链接。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2011-07-19
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2011-05-29
相关资源
最近更新 更多