在 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\;)
这将识别带有负前瞻的 & 符号,以确保它实际上不是正确转义的 & 符号。当我确定了这些情况后,我可以用适当的 & 替换
当然,有一个问题是这会匹配其他转义字符,例如 > < " 等,所以我也需要取消匹配这些字符。也许使用更通用的形式,例如正则表达式不匹配的 & 符号后跟 2-4 个字符,然后是分号。
但我担心的是,还有其他一些我没有想到的和符号的情况,并且在我得到的少数样本中没有体现出来。我正在寻找一种不会弄乱正确 xml 的安全方法。
TLDR:如何识别不属于正确 xml 的 & 符号,但是否是属性值中未转义的 & 符号?
【问题讨论】:
您能否提供更多实际 xml 示例以及每个示例的预期/期望匹配项? “遗产”有多少遗产?如果可能的话,我会修复源而不是修复产品。 另见How to parse invalid (bad / not well-formed) XML?。 【参考方案1】:您可以用&amp;
替换以下正则表达式模式:
&(?!(?:#\d+|#x[0-9a-f]+|\w+);)
演示:https://regex101.com/r/3MTLY9/2
【讨论】:
非常好。添加到我的canonical dealing with bad XML QA。谢谢。以上是关于在 XML 中删除流氓 & 符号的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章