python - 查找子节点包含一些文本的非根父节点

标签 python xml xpath elementtree

我有一些 xml;

<root>
    <parent>
        <child>foo987654</child>
    </parent>
    <parent>
        <child>bar15245</child>
    </parent>
    <parent>
        <child>baz87742</child>
    </parent>
    <parent>
        <child>foo123456</child>
    </parent>
</root>

我正在使用 python 和 etree 模块,我想选择子节点以“foo”开头的所有 <parent> 节点。我知道 etree 对 xpath 的支持有限,但我是 xpath 新手,所以我正在努力寻找最佳解决方案。我会想一些类似的东西

parent[(contains(child,'foo'))] 

但我想拒绝包含 foo 但不是以 foo 开头的父节点(即 <child>125456foo</child> ),所以我不确定这是否可行。此外,我不确定 etree 是否支持这种级别的 xpath...

编辑:

另一个可接受的解决方案是选择其 child 的文本在列表中的 parent 。 伪代码 parent => child [文本=“foo1”|| “bar1” || “bar2”]

这可能吗?

最佳答案

这将得到你想要的:

[elem for elem in root.findall('parent') if elem.find('child').text.startswith('foo')]

观看它的实际效果:

s = """<root>
    <parent>
        <child>foo987654</child>
    </parent>
    <parent>
        <child>bar15245</child>
    </parent>
    <parent>
        <child>baz87742</child>
    </parent>
    <parent>
        <child>foo123456</child>
    </parent>
</root>"""

import xml.etree.ElementTree as ET

root = ET.fromstring(s)
elems = [elem for elem in root.findall('parent') if elem.find('child').text.startswith('foo')]

检查数据:

for elem in elems:
    print elem.find('child').text
>>>
foo987654
foo123456

关于python - 查找子节点包含一些文本的非根父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076813/

相关文章:

Python给出 "module'对象没有属性 'message_from_string'错误

xml - 使用 XSLT 修改 .wxs 中的 heat

python - 获取 xpath() 以返回空值

php - 如何在div父节点中追加子节点?

.net - XPath:根据其他节点的值选择节点

python - 元组的 Pandas 数据框?

python - 2 网络摄像头饲料不工作 opencv

python - python 如何检查一个列表是否在另一个具有相同顺序的列表中

xml - ASP 经典 - XML Dom

sql-server - 是否可以在 SQL Server 2005/SQL Server 2008 的 XML 列中设置索引?