用Python中的&符号修复无效的XML

问题描述 投票:5回答:2

我正在使用Python处理从其他系统收到的XML文件。该系统产生无效的XML。主要是,它不会转义XML中的某些&。因此,例如,我有这样几行:

<IceCream>Ben&Jerry</IceCream>

当然,当使用SAX或DOM进行解析时,它将引发无效的令牌错误。对于更一般的背景-这是一个非常大的文件(2MB),相当平坦,并且在CDATA中包含很多数据。

我尝试过的:

  1. 编写Regex以仅替换未保留的&,而不重新保留&gt;等等:&(?!\w{2,4};)。它修复了它,但是它逃脱了CDATA中的“&”号,然后在目标系统中引起了错误。之后,我无法取消转义CDATA中的所有内容,因为其中一些需要保持转义。
  2. 使用美丽的(石)汤。也很倒霉。它创建了一个实体(即&Jerry;),而不是逃避散乱的“&”号。不好。

下一步将是使用状态机编写我自己的解析器。救我脱离那条路。它不是一个复杂的结构(非常平坦,最多4层深度),因此正则表达式也许能够捕获不在CDATA中的区域。

非常感谢。

python xml regex dom sax
2个回答
4
投票

[tidylib使用Python绑定:

>>> import tidylib
>>> print tidylib.tidy_document("<IceCream>Ben&Jerry</IceCream>", {"input_xml": True})[0]
<IceCream>Ben&amp;Jerry</IceCream>

请参见整洁的官方文档以获取parser options的列表。


0
投票

“无意中拖曳堆栈溢出...可能会导致脆弱的代码,并可能导致危险。”https://www.tjohearn.com/2018/01/24/safe-ampersand-parsing-in-xml-files/

© www.soinside.com 2019 - 2024. All rights reserved.