根据多个兄弟条件选择兄弟节点值,不使用xpath字符串

问题描述 投票:0回答:1

使用 xpath 查找 xml 节点有多种答案,如这里。在使用 lxml 的 python 中,是否有更 Pythonic 的方式来构建这个条件列表?我知道我可以使用 f 字符串构建 xpath 字符串,但也许有一种更优雅的方法。

例如:

root.xpath('//Group/Person[Position = "CEO" and Street = "Main" and Name = "Paul"]/Condition[Group = "Manager"]/Room')[0].text

可以像这样构建:

root.xpath(f'//Group/Person[Position = "{role}" and Street = "{street}" and Name = "{name}"]/Condition[Group = "{group}"]/Room')[0].text

但看起来还是很笨拙。

python xml xpath lxml
1个回答
0
投票

是的,您可以为 XPath 设置参数,这里是 lxml 和 SaxonC 12 的示例:

from lxml import etree

from saxonche import PySaxonProcessor

xml = '''<root>
  <item>
    <name>foo</name>
    <value>bar</value>
  </item>
  <item>
    <name>bar</name>
    <value>foo</value>
  </item>
</root>'''

root = etree.fromstring(xml)

name = 'bar'

print(root.xpath('item[name = $name]', name=name))

with PySaxonProcessor() as saxon_proc:
    xpath_proc = saxon_proc.new_xpath_processor()

    xpath_proc.set_context(xdm_item=saxon_proc.parse_xml(xml_text=xml))

    xpath_proc.set_parameter('name', saxon_proc.make_string_value(name))

    print(xpath_proc.evaluate('root/item[name = $name]'))
© www.soinside.com 2019 - 2024. All rights reserved.