Python xml - 处理未封闭的令牌

10m*_*mjg 5 python xml elementtree

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

简单的背景知识:这些 XML 文件在某一点上是完全有效的,但不知何故,在历史上处理它们时,我复制/粘贴它们的过程可能已损坏它们。(事实证明,这是一个冲洗问题/语句未关闭,如果您关心的话,请参阅我在该调查中获得的良好帮助...... Python Shutil copyfile - 缺少最后几行)。

无论如何,回到这个问题的重点。
我仍然想阅读这些文档的前 100,000 行左右,它们是有效的 XML。这些文件仅缺少 6MB 文件的最后 4 或 5KB。不过,正如前面提到的,该文件只是“剪切”了。它看起来像这样:

</Maintag>




<Maintag>
    <Change_type>NQ</Change_type>
    <Name>Atlas</Name>
    <Test>ATLS</Test>
    <Other>NYSE</Other>
    <Scheduled_E
Run Code Online (Sandbox Code Playgroud)

其中(也许很明显)Scheduled_E 应该是另一个属性 <.Scheduled_Event> 的开头。但文件的中间标签被缩短。再一次,在文件中的这一点之前,我想读入数千个“好”“Maintag”条目,接受截止条目(以及显然应该在之后出现的任何内容)作为不可恢复的失败。

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

如果有人想帮助我进行这种字符串替换,那么起始标签是:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<FirstTag>
    <Source FileName="myfile">
Run Code Online (Sandbox Code Playgroud)

我希望比这更容易,可能有一个 elementtree 或 beautifulsoup 或其他方式来处理这种情况......我已经做了相当多的搜索,但没有什么看起来是容易/明显的。

谢谢

har*_*r07 6

为了处理未封闭的元素 - 或如本问题标题所示的标记 - 我建议尝试lxml. lxml的选项XMLParser记录为:recover

恢复 - 努力解析损坏的 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))
Run Code Online (Sandbox Code Playgroud)

上述代码打印的恢复的 XML 如下:

<root>
    <Maintag>
        <Change_type>NQ</Change_type>
        <Name>Atlas</Name>
        <Test>ATLS</Test>
        <Other>NYSE</Other>
        <Scheduled_E/></Maintag></root>
Run Code Online (Sandbox Code Playgroud)