【问题标题】:invalid predicate by searching with multiple variable condition lxml python通过使用多个变量条件lxml python搜索的无效谓词
【发布时间】:2021-02-03 06:42:00
【问题描述】:

使用 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 个属性的值?

【问题讨论】:

    标签: python xml-parsing lxml findall multiple-conditions


    【解决方案1】:

    .//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))
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多