在 XML 中删除流氓 & 符号的最佳方法是啥?

Posted

技术标签:

【中文标题】在 XML 中删除流氓 & 符号的最佳方法是啥?【英文标题】:What is the best way of removing rogue ampersands in XML?在 XML 中删除流氓 & 符号的最佳方法是什么? 【发布时间】:2019-03-27 19:09:54 【问题描述】:

(TLDR 在底部)

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

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

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

我正在尝试使用正则表达式来识别发生这种情况的情况。 为了说明,考虑一下:

&(?!amp\;)

这将识别带有负前瞻的 & 符号,以确保它实际上不是正确转义的 & 符号。当我确定了这些情况后,我可以用适当的 & 替换

当然,有一个问题是这会匹配其他转义字符,例如 &gt &lt &quot 等,所以我也需要取消匹配这些字符。也许使用更通用的形式,例如正则表达式不匹配的 & 符号后跟 2-4 个字符,然后是分号。

但我担心的是,还有其他一些我没有想到的和符号的情况,并且在我得到的少数样本中没有体现出来。我正在寻找一种不会弄乱正确 xml 的安全方法。

TLDR:如何识别不属于正确 xml 的 & 符号,但是否是属性值中未转义的 & 符号?

【问题讨论】:

您能否提供更多实际 xml 示例以及每个示例的预期/期望匹配项? “遗产”有多少遗产?如果可能的话,我会修复源而不是修复产品。 另见How to parse invalid (bad / not well-formed) XML?。 【参考方案1】:

您可以用&amp;amp; 替换以下正则表达式模式:

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

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

【讨论】:

非常好。添加到我的canonical dealing with bad XML QA。谢谢。

以上是关于在 XML 中删除流氓 & 符号的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式删除大于/小于符号 < > 内的字符串? [关闭]

xml配置文件特殊符号的处理方法

修复错误的 XML 文件(例如,未转义等)[重复]

mac的终端中终结删除文件夹的方法

XML 中大于符号的使用

如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?