使用 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
但看起来还是很笨拙。
是的,您可以为 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]'))