删除XML中流氓&符的最佳方法是什么?

时间:2018-10-23 13:54:35

标签: c# regex xml linq-to-xml

(底部的TLDR)

我们有一个遗留系统,该系统已实现了自己的XML读取器/写入器。问题在于它允许在属性值中使用文字“&”。

<SB nae="Name" net="HV & DD"/>

当我使用XDocument.Parse()方法读取数据时,这当然会失败。我正在研究清理数据的方法。

我正在尝试使用正则表达式来确定发生这种情况的情况。 为了说明这一点,请考虑以下问题:

&(?!amp\;)

这将以负的前瞻性标识“&”号,以确保它实际上不是正确转义的“&”号。确定这些情况后,可以用适当的&

代替

当然,存在一个问题,它将与其他转义的字符(例如&gt&lt&quot等)匹配,因此我也需要取消匹配这些字符。也许使用更通用的形式,例如正则表达式不匹配的“&”号,后跟2-4个字符,然后是分号。

但是我担心的是,还有其他我不曾想到的“&”号案例,这些案例在我获得的少数样本中没有体现。我正在寻找一种不会弄乱适当xml的安全方法。

TLDR:如何识别不属于适当xml的“&”符号,但属性值中未转义的“&”符号的情况?

1 个答案:

答案 0 :(得分:2)

您可以将以下正则表达式模式替换为&amp;

&(?!(?:#\d+|#x[0-9a-f]+|\w+);)

演示:https://regex101.com/r/3MTLY9/2