首页 文章

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

提问于
浏览
5

我使用Python来操作从另一个系统收到的XML文件 . 该系统产生无效的XML . 主要是,它不会逃避XML中的某些& .
所以,例如,我有一些这样的行:

<IceCream>Ben&Jerry</IceCream>

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

我尝试过的:

  • 写一个 Regex 只替换unesacped&,没有reesacaping&gt;等等: &(?!\w{2,4};) . 它修复了它,但它在CDATA中逃脱了&符号,然后在目标系统中导致错误 . 之后我可以在CDATA中使用它,因为其中一些需要保持转义 .

  • 使用 Beautiful (Stone) Soup . 也不走运 . 它没有逃避松散的&符号,而是创建了一个实体(即 &Jerry; ) . 不好 .

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

非常感谢 .

1 回答

  • 4

    使用tidylib的Python绑定:

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

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

相关问题