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

标签 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,我尝试访问元素 中的文本。我已经找到了解决方案,但我确信有更好、更有效的方法来做到这一点。我的解决方案:

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')

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

所以我的问题是:是否有一种更有效的方法来访问 的文本,同时保留在根循环中,因为我还需要访问其他元素。

最佳答案

您可以使用XPath :

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

我们询问与路径匹配的所有元素。在本例中,路径为 /root/targetroot/targetcontainer/target ,这意味着

all the <target> elements that are inside a <targetcontainer> element, inside a <targetroot> element, inside a <root> element. Also, the <root> element should be the document root because it is preceded by /, which means the beginning of the document.

此外,您的 XML 文档还有两个问题。一、<?xml version="1.0"?>声明应该是文档中的第一件事 - 在这个例子中,它前面有一个换行符和一些空格。另外,它不是标签,不应关闭,因此 </xml>字符串末尾的内容应该被删除。无论如何,我已经编辑了你的问题。

编辑:这个解决方案还可以改进。您不需要传递所有路径 - 您只需询问所有元素 <target>文档内。这是通过在标签名称前添加两个斜杠来完成的。因为您想要所有 <target>文本,无论它们在哪里,这可能是一个更好的解决方案。因此,上面的循环可以写成:

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

一开始我尝试过,但没有成功。然而,问题是 XML 中的语法问题,而不是 XPath,但我尝试了另一条更长的路径,但忘记重试此路径。对不起!不管怎样,我希望我能对 XPath 有所了解:)

关于python - 在 Python 中使用 lxml 遍历 XML 的最快/最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548531/

相关文章:

python - Gekko:获得的解决方案有问题

python - 如何使用 python/BeautifulSoup 或类似工具将 kml 文件解析为 csv?

javascript - 使用 ajax 和 django 根据用户提供的值进行过滤

python - 解析带有 `pythons etree.iterparse()` 的巨大 xml 文件无法正常工作。代码有逻辑错误吗?

python - 使用 python lxml 在 xml 文件中写入目录树

python - 保留 XML 属性顺序?

python - 如何从 Tensorflow 中的检查点文件加载单个张量?

delphi - 用于Delphi XE2的Windows和Mac XML库

xml - 使用 perl 和 LibXML 从 XML 中提取节点并解析结果

ios - RestKit ios 相同类型的嵌套对象