gpt4 book ai didi

Python,lxml - 获取兄弟标签的(孙)子文本

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:05 26 4
gpt4 key购买 nike

我有一个 XML 需要解析,这对我来说非常棘手。

<bundles>
<bundle>
<bitstreams>
<bitstream>
<id>1234</id>
</bitstream>
</bitstream>
<name>FOO</name>
</bundle>
<bundle> ... </bundle>
</bundles>

我想遍历此 XML 并在 bundlebitstreams 中找到所有 id 值,其中 name 元素的值为 'FOO'。我对任何未命名为“FOO”的 bundle 不感兴趣,并且 bundle 中可能有任意数量的 bundle 和任意数量的比特流。

我一直在使用 tree.findall('./bundle/name') 来查找 FOO 包,但这只会返回一个列表,我无法通过 id 值(value)观:

for node in tree.findall('./bundle/name'):
if node.text == 'FOO':
id_values = tree.findall('./bundle/bitstreams/bitstream/id')
for value in id_values:
print value.text

这会打印出所有 id 值,而不是包“FOO”的那些值。

我如何遍历这棵树,找到具有名称 FOO 的bundle,获取此bundle 节点并收集 id 值嵌套在里面?这里的 XPath 参数不正确吗?

我在 Python 中工作,使用 lxml 绑定(bind)——但我认为任何 XML 解析器都可以;这些不是大型 XML 树。

最佳答案

您可以使用 xpath达到目的。以下 Python 代码完美运行:

import libxml2
data = """
<bundles>
<bundle>
<bitstreams>
<bitstream>
<id>1234</id>
</bitstream>
</bitstreams>
<name>FOO</name>
</bundle>
</bundles>
"""
doc = xmllib2.parseDoc(data)
for node in doc.xpathEval('/bundles/bundle/name[.="FOO"]/../bitstreams/bitstream/id'):
print node

或使用 lxml (data 与上例相同):

from lxml import etree

bundles = etree.fromstring(data)

for node in bundles.xpath('bundle/name[.="FOO"]/../bitstreams/bitstream/id'):
print(node.text)

输出:

1234

如果<bitstreams>元素始终在 <name> 之前元素,您还可以使用更高效的 xpath 表达式:

'bundle/name[.="FOO"]/preceding-sibling::bitstreams/bitstream/id'

关于Python,lxml - 获取兄弟标签的(孙)子文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com