我使用python来操作从另一个系统接收的xml文件。那个系统产生无效的XML。主要是,它没有逃出xml中的一些。
例如,我有一些这样的台词:

<IceCream>Ben&Jerry</IceCream>

当然,当用sax或dom解析时,它会抛出无效的令牌错误。
对于一些更一般的背景-它是一个非常大的文件(2 MB),相当平坦,并且在CData中包含很多数据。
我试过的:
编写一个正则表达式以仅替换未保存的&,而不重新编译,例如:&(?!\w{2,4};)。它修复了这个问题,但它在cdata中转义了与号,然后导致了目标系统中的错误。我无法在事后对CData中的所有内容进行调整,因为其中一些内容需要保留。
用漂亮的(石头)汤。也不走运。它创建了一个实体(即&Jerry;),而不是转义松散的与号。不好的。
下一步是使用状态机编写自己的解析器。别让我走那条路。
它不是一个复杂的结构(非常平坦,最多4层深),因此regex可能能够捕获不在cdata中的区域。
多谢。

最佳答案

tidylib使用python绑定:

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

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

07-24 20:49