在Python中修复含有与符号的无效XML

5 投票
1 回答
3248 浏览
提问于 2025-04-16 18:08

我正在用Python处理一个从其他系统收到的XML文件。那个系统生成的XML有问题,主要是它没有正确处理一些&符号。


举个例子,我有一些这样的行:

<IceCream>Ben&Jerry</IceCream>


当然,当用SAX或DOM解析时,它会报无效的标记错误。

再说一下背景信息——这个文件很大(2MB),结构比较简单,里面有很多CDATA的数据。

我尝试过的办法:

  1. 写了一个正则表达式,只替换那些没有转义的&符号,而不去重新转义其他符号,比如>:&(?!\w{2,4};)。这个办法有效,但它把CDATA中的&符号也转义了,这导致在目标系统中出现了错误。我之后不能把CDATA里的所有内容都取消转义,因为有些内容需要保持转义状态。
  2. 使用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&amp;Jerry</IceCream>

查看官方的tidy文档,里面有一份解析选项的列表。

撰写回答