使用Python中的lxml遍历XML的最快/最佳方法

时间:2011-12-17 22:54:24

标签: python xml-parsing lxml

我有一个如下所示的XML文件:

xml = '''<?xml version="1.0"?>
        <root>
            <item>text</item>
            <item2>more text</item2>
            <targetroot>
                <targetcontainer>
                    <target>text i want to get</target>
                </targetcontainer>
                <targetcontainer>
                    <target>text i want to get</target>
                </targetcontainer>
            </targetroot>
            ...more items
        </root>
'''

使用lxml我试图访问元素中的文本&lt;目标&gt;。我找到了解决方案,但我确信有更好,更有效的方法来做到这一点。我的解决方案:

target = etree.XML(xml)

for x in target.getiterator('root'):
    item1 = x.findtext('item')
    for target in x.iterchildren('targetroot'):
        for t in target.iterchildren('targetcontainer'):
            targetText = t.findtext('target')

虽然这有效,但是因为它让我可以访问root中的所有元素以及目标元素,所以我很难相信这是最有效的解决方案。

所以我的问题是:是否有更有效的方式来访问&lt;保留在root循环中的目标&gt;&#39;文本,因为我还需要访问其他元素。

1 个答案:

答案 0 :(得分:3)

您可以使用XPath

for x in target.xpath('/root/targetroot/targetcontainer/target'):
    print x.text

我们要求所有符合路径的元素。在这种情况下,路径为/root/targetroot/targetcontainer/target,表示

  

位于<target>元素内的<targetcontainer>元素内<targetroot>元素内<root>元素内的所有<root>元素。此外,/元素应该是文档根,因为它前面是<?xml version="1.0"?>,这意味着文档的开头。

此外,您的XML文档有两个问题。首先,</xml>声明应该是文档中的第一件事 - 在这个例子中,它前面有换行符和一些空格。此外,它不是标记,也不应该关闭,因此应删除字符串末尾的<target>。无论如何,我已经编辑了你的问题。

编辑:此解决方案尚未得到改进。您不需要传递所有路径 - 您可以只询问文档中的所有元素<target>。这是通过在标签名称前加两个斜杠来完成的。由于您需要所有 for x in target.xpath('//target'): print x.text 文本,而不管它们在何处,这可能是更好的解决方案。因此,上面的循环可以写成:

{{1}}

我一开始尝试过,但没效果。然而,问题是XML中的语法问题,而不是XPath,但我尝试了另一个更长的路径而忘了重试这个问题。抱歉!无论如何,我希望我对XPath有所了解:))