代码之家  ›  专栏  ›  技术社区  ›  Ivan

如何使用XPath通过其同级节点的属性识别XML节点?

  •  1
  • Ivan  · 技术社区  · 9 年前

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

    <?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>
    

    我的目标是生成一个XPath查询,该查询返回ITEMLIST节点,该节点具有属性name=“file_names”,而同级ITEM节点具有属性name=“toppas_type”,value=“inputfile list”。我尝试了以下方法:

    './NODE/NODE[ITEM[@name="toppas_type"][@value="input file list"]]/ITEMLIST[@name="file_names"]'

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   alecxe    9 年前

    xml.etree.ElementTree 有一个 limited XPath support :

    此模块为以下对象提供有限的XPath表达式支持 定位树中的元素。目标是支持 缩写语法;完整的XPath引擎不在 模块。

    如果您可以切换到 lxml ,可以使用 following-sibling 轴:

    //ITEM[@name = 'toppas_type' and @value = 'input file list']/following-sibling::ITEMLIST[@name = 'file_names']