在Python中修复含有与符号的无效XML
我正在用Python处理一个从其他系统收到的XML文件。那个系统生成的XML有问题,主要是它没有正确处理一些&符号。
举个例子,我有一些这样的行:
<IceCream>Ben&Jerry</IceCream>
当然,当用SAX或DOM解析时,它会报无效的标记错误。
再说一下背景信息——这个文件很大(2MB),结构比较简单,里面有很多CDATA的数据。
我尝试过的办法:
- 写了一个正则表达式,只替换那些没有转义的&符号,而不去重新转义其他符号,比如>:
&(?!\w{2,4};)
。这个办法有效,但它把CDATA中的&符号也转义了,这导致在目标系统中出现了错误。我之后不能把CDATA里的所有内容都取消转义,因为有些内容需要保持转义状态。 - 使用Beautiful Soup。结果也不理想。它没有处理松散的&符号,而是创建了一个实体(比如
&Jerry;
)。这可不好。
接下来的步骤是用状态机写一个自己的解析器。希望能避免走这条路。
这个结构并不复杂(最多只有4层),所以也许正则表达式可以找到不在CDATA中的部分。
非常感谢。
1 个回答
6
使用Python的tidylib库:
>>> import tidylib
>>> print tidylib.tidy_document("<IceCream>Ben&Jerry</IceCream>", {"input_xml": True})[0]
<IceCream>Ben&Jerry</IceCream>
查看官方的tidy文档,里面有一份解析选项的列表。