Python xml - 处理未关闭的令牌

Python xml - handle unclosed token

我正在读取数百个 XML 文件并使用 xml.etree.ElementTree 解析它们。

快速背景只是fwiw: 这些 XML 文件在某一时刻是完全有效的,但不知何故,在历史上处理它们时,我的过程 copied/pasted 它们可能已经损坏了它们。 (事实证明这是一个冲洗问题/声明未关闭,如果您关心,请参阅我在调查中获得的良好帮助... )。

总之回到这个问题的重点。
我仍然想阅读这些有效文档的前 100,000 行左右 XML。这些文件仅缺少 6MB 文件的最后 4 或 5KB。不过,如前所述,该文件只是 'cuts out'。它看起来像这样:

</Maintag>




<Maintag>
    <Change_type>NQ</Change_type>
    <Name>Atlas</Name>
    <Test>ATLS</Test>
    <Other>NYSE</Other>
    <Scheduled_E

其中(可能很明显)Scheduled_E 是应该是另一个属性的开始,例如 <.Scheduled_Event>。但是文件被缩短了 mid 标签。再一次,在文件中的这一点之前,我想读入几千个 'good' "Maintag" 条目,接受截止条目(显然任何应该在后面出现的条目)作为不可恢复的失败。

一个简单但不完整的处理方法可能是简单地 - 预 XML 处理 - 在文件中查找字符串 <./Maintag> 的最后一个实例,并替换后面的内容(将在某些时候被破坏)与 'opening' 标签。同样,这至少让我可以处理仍然存在且有效的内容。

如果有人想帮我进行那种字符串替换,那么开头的标签是:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<FirstTag>
    <Source FileName="myfile">

我希望比这更简单,可能有一个 elementtree 或 beautifulsoup 或其他处理这种情况的方法...我已经进行了大量搜索,但似乎什么都没有 easy/obvious.

谢谢

为了处理未闭合的元素 - 或本问题标题中的令牌 -,我建议尝试 lxmllxmlXMLParser 具有 recover 选项,其中 documented 为:

recover - try hard to parse through broken XML

例如,给定一个损坏的 XML 如下:

from lxml import etree

xml = """
<root>
    <Maintag>
        <Change_type>NQ</Change_type>
        <Name>Atlas</Name>
        <Test>ATLS</Test>
        <Other>NYSE</Other>
        <Scheduled_E
"""
parser = etree.XMLParser(recover=True)
doc = etree.fromstring(xml, parser=parser)
print(etree.tostring(doc))

上面代码打印出来的恢复的XML如下:

<root>
    <Maintag>
        <Change_type>NQ</Change_type>
        <Name>Atlas</Name>
        <Test>ATLS</Test>
        <Other>NYSE</Other>
        <Scheduled_E/></Maintag></root>