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.
谢谢
为了处理未闭合的元素 - 或本问题标题中的令牌 -,我建议尝试 lxml
。 lxml
的 XMLParser
具有 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>
我正在读取数百个 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.
谢谢
为了处理未闭合的元素 - 或本问题标题中的令牌 -,我建议尝试 lxml
。 lxml
的 XMLParser
具有 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>