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

时间:2011-05-22 15:03:43

标签: python xml regex dom sax

我正在使用Python来操作从另一个系统收到的XML文件。该系统产生无效的XML。主要是,它并没有逃过一些&在XML中。
所以,例如,我有一些这样的行:

<IceCream>Ben&Jerry</IceCream>


当然,当使用SAX或DOM解析时,它会抛出无效的令牌错误。
对于一些更一般的背景 - 它是一个非常大的文件(2MB),相当平坦,并且在CDATA中包含大量数据。

我尝试了什么:

  1. 编写正则表达式以仅替换unesacped&amp;,而不使用reesacaping&amp; gt;等等:&(?!\w{2,4};)。它修复了它,但它在CDATA中逃脱了&符号,然后在目标系统中导致错误。我之后无法忘记CDATA中的所有内容,因为其中一些内容需要保持转义。
  2. 使用美丽(石头)汤。也不走运。它没有逃避松散的&符号,而是创建了一个实体(即&Jerry;)。不好。
  3. 下一步将使用状态机编写我自己的解析器。救我走这条路。
    它不是一个复杂的结构(非常扁平,最多4层深),因此正则表达式可能能够捕获不在CDATA中的区域。

    非常感谢。

1 个答案:

答案 0 :(得分:4)

使用tidylib的Python绑定:

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

有关parser options的列表,请参阅官方整洁文档。