使用lxml Python 3

时间:2017-02-18 12:26:51

标签: xml python-3.x xml-parsing lxml

我在使用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流并重命名无效属性。不幸的是,我不知道如何编写这个自定义解析器(没有足够的经验)。 一种选择是两次通过:

  1. 使用正则表达式读取文件并替换属性
  2. 将此更正的文件解析为lxml
  3. 但我很好奇是否有更有效的方法来做到这一点。 感谢。

0 个答案:

没有答案