通过使用多个变量条件lxml python搜索来无效谓词

问题描述

使用lxml,我尝试从XML文件中的特定阶段解析特定街道:

XML文件的一部分:

<jndi_values environment="Ontwikkel" street="str1">
  <jndi_value key="ecm-eds-configVersie48str1a" value="eds/config/valstr1a">ONT_Value_3str1a</jndi_value>
  <jndi_value key="str1a" value="eds/config/valstr1">ONT_Value_WWW4a</jndi_value>
</jndi_values>
<jndi_values environment="Ontwikkel" street="str2">
  <jndi_value key="ecm-eds-configVersie48str2a" value="eds/config/str2a">ONT_Value_str2a</jndi_value>
  <jndi_value key="4WWW8str2a" value="eds/config/cW8str2">ONT_Value_4str2a</jndi_value>
</jndi_values>

我想查找例如environment =“ Ontwikkel”和street =“ str2”,仅查找那些值。

我尝试过:

only_jndi_values = package_config.findall("jndi_values[@environment='" + current_environment + "' and street='" + current_street + "']/jndi_value")

only_jndi_values = package_config.findall("jndi_values[@environment='" + current_environment + "' and @street='" + current_street + "']/jndi_value")

但它会抛出此无效的谓词错误

File "src/lxml/etree.pyx",line 1553,in lxml.etree._Element.findall
File "src/lxml/_elementpath.py",line 322,in lxml._elementpath.findall
File "src/lxml/_elementpath.py",line 300,in lxml._elementpath.iterfind
File "src/lxml/_elementpath.py",line 283,in lxml._elementpath._build_path_iterator
File "src/lxml/_elementpath.py",line 229,in lxml._elementpath.prepare_predicate
SyntaxError: invalid predicate

如何使用lxml findall()评估2个属性的值?

解决方法

.// jndi_values [@ environment =“ Ontwikkel”] [@ street =“ str2”]


from lxml import etree

data = '''\
<foo>
<bar>
<jndi_values environment="Ontwikkel" street="str1">
  <jndi_value key="ecm-eds-configVersie48str1a" value="eds/config/valstr1a">ONT_Value_3str1a</jndi_value>
  <jndi_value key="str1a" value="eds/config/valstr1">ONT_Value_WWW4a</jndi_value>
</jndi_values>
<jndi_values environment="Ontwikkel" street="str2">
  <jndi_value key="ecm-eds-configVersie48str2a" value="eds/config/str2a">ONT_Value_str2a</jndi_value>
  <jndi_value key="4WWW8str2a" value="eds/config/cW8str2">ONT_Value_4str2a</jndi_value>
</jndi_values>
</bar>
</foo>
'''

environment = "Ontwikkel"
street = "str2"

tree = etree.fromstring(data)
xpath = f'.//jndi_values[@environment="{environment}"][@street="{street}"]'

print(xpath)

for e in tree.findall(xpath):
    for s in e.itertext():
        print(repr(s))