我在使用Python3中的lxml解析无效XML时遇到问题。我目前的代码是(这只是为了简单起见的一个例子。在现实生活中我必须阅读并处理100-300MB XML文件):
xml_str='''<r>
<n type="1" id="n1-1">
<p a="a" 6_x="x">text1</p>
</n>
<n type="2" id="n2-1">
<p a="a" 6_x="x">text2</p>
</n>
<n type="1" id="n1-2">
<p a="a" 6_x="x">text3</p>
</n>
</r>'''
import lxml.etree
xpath='/r/n[@type="1"]/p/text()'
parser = lxml.etree.XMLParser(recover=True)
tree = lxml.etree.fromstring(xml_str, parser)
r = tree.xpath(xpath)
print(r)
我得到空结果,假设XMLParser
启用recover
模式,只是跳过无效的xml节点。
我的预期结果是:
[&#39; text1&#39;,&#39; text3&#39;]
如果我修复了XML(即:将6_x
中的无效属性重命名为f.e. z6_x
),一切正常。
我怎么能预处理XML(可能使用自定义XMLParser?)来使用lxml解析XML?我想我应该在将此流发送到lxml之前读取xml流并重命名无效属性。不幸的是,我不知道如何编写这个自定义解析器(没有足够的经验)。
一种选择是两次通过:
但我很好奇是否有更有效的方法来做到这一点。 感谢。