Python xml - 处理未关闭的令牌

时间:2015-07-21 15:14:23

标签: python xml elementtree

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

快速背景只是fwiw: 这些XML文件在某一时刻完全有效,但不知何故,在历史上处理它们时,我复制/粘贴它们的进程可能已经损坏了它们。 (事实证明这是一个令人沮丧的问题/声明没有结束,如果你关心,看到我在... Python shutil copyfile - missing last few lines调查得到的好帮助。

无论如何回到这个问题。
我仍然希望阅读这些有效XML文档的前100,000行左右。这些文件只丢失了6MB文件的最后4或5KB。然而,正如前面提到的那样,该文件只是“切断”。它看起来像这样:

</Maintag>




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

其中(可能很明显)Scheduled_E是应该是另一个属性的开头,&lt; .Scheduled_Event&gt ;,比如说。但是文件在标签中间缩短了。再一次,在文件中的这一点之前,有几千个“好”的“Maintag”条目,我想读入,接受截止条目(显然任何应该发生的事情)作为不可恢复的失败。

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

如果有人想帮我解决这种字符串替换问题,那么fwiw开头标记是:

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

我希望比这更容易,可能会有一个elementtree或beautifulsoup或其他处理这种情况的方式......我做了大量的搜索,似乎没有什么容易/显而易见。

由于

1 个答案:

答案 0 :(得分:3)

为了处理未关闭的元素 - 或者像在这个问题的标题中那样的标记,我建议尝试lxmllxml的{​​{1}} XMLParser选项documented为:{/}

  

recover - 尝试解析破碎的XML

例如,给定一个破碎的XML如下:

recover

上面代码打印的恢复的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))