Python 如何使用XPath通过其同级节点的属性发现XML节点?

Python 如何使用XPath通过其同级节点的属性发现XML节点?,python,xml,python-3.x,xpath,elementtree,Python,Xml,Python 3.x,Xpath,Elementtree,假设我有以下XML文件(可有可无的部分用“…”标记): ... ... 我的目标是进行XPath查询,返回具有属性name=“file\u name”的ITEMLIST节点和具有属性name=“toppas\u type”、value=“input file list”的同级项节点。我尝试了以下方法: 。/NODE/NODE[ITEM[@name=“toppas_type”][@value=“input file list”]]/ITEMLIST[@name=“file_name”]” 使用

假设我有以下XML文件(可有可无的部分用“…”标记):


...
...
我的目标是进行XPath查询,返回具有属性name=“file\u name”的ITEMLIST节点和具有属性name=“toppas\u type”、value=“input file list”的同级项节点。我尝试了以下方法:

。/NODE/NODE[ITEM[@name=“toppas_type”][@value=“input file list”]]/ITEMLIST[@name=“file_name”]”


使用Python 3.4中的xml.etree.ElementTree,但我得到一个错误“invalid predicate”。我认为我的查询包含一个愚蠢的错误,但我找不到它。

xml.etree.ElementTree
有一个:

此模块对的XPath表达式提供有限的支持 在树中定位元素。目标是支持一小部分 缩略语法;完整的XPath引擎不在 模块

如果您同意切换到,可以使用axis解决:


很好,谢谢。如果现在不知道
ITEMLIST
是否实际上是一个后续兄弟,但只是一个兄弟,我如何修改您的解决方案?@Ivan只需将
前面的兄弟
后面的兄弟
组合起来即可。例如:
//ITEMLIST[@name='file_names'][后面的兄弟姐妹::ITEM/@name='toppas_type'或前面的兄弟姐妹姐妹::ITEM/@name='toppas_type']
(未测试)。谢谢,我将尝试此变体。
lxml
确实有效!我使用对父节点的“..”引用成功地完成了我想要的操作:
。/node/node/ITEM[@name=“toppas\u type”][@value=“input file list”]/../ITEMLIST[@name=“file\u names”]
。它看起来比混合
前面/后面的兄弟姐妹
要短。
<?xml version="1.0" encoding="ISO-8859-1"?>
<PARAMETERS version="1.6.2" xsi:noNamespaceSchemaLocation="http://open-ms.sourceforge.net/schemas/Param_1_6_2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NODE name="info" description="">
    <ITEM name="version" value="2.0.0" type="string" description="" required="false" advanced="false" />
    <ITEM name="num_vertices" value="5" type="int" description="" required="false" advanced="false" />
    <ITEM name="num_edges" value="4" type="int" description="" required="false" advanced="false" />
    <ITEM name="description" value="&lt;![CDATA[]]&gt;" type="string" description="" required="false" advanced="false" />
  </NODE>
  <NODE name="vertices" description="">
    <NODE name="0" description="">
      <ITEM name="recycle_output" value="false" type="string" description="" required="false" advanced="false" />
      <ITEM name="toppas_type" value="input file list" type="string" description="" required="false" advanced="false" />
      <ITEMLIST name="file_names" type="string" description="" required="false" advanced="false">
        <LISTITEM value="input_data/STD_MIX_1_25_neg.mzML"/>
      </ITEMLIST>
      <ITEM name="x_pos" value="-1680" type="double" description="" required="false" advanced="false" />
      <ITEM name="y_pos" value="-620" type="double" description="" required="false" advanced="false" />
    </NODE>
    <NODE name="1" description="">
    ...
    </NODE>
    ...
  </NODE>
</PARAMETERS>
//ITEM[@name = 'toppas_type' and @value = 'input file list']/following-sibling::ITEMLIST[@name = 'file_names']