首页 > 解决方案 > 基于同一元素中的条件属性打印属性值(XML Python)

问题描述

我有一个这样的xml文件:

<button_map>
<button id="abs_axis_11" label="">
      <device type="keyboard" id="0" name=""/>
      <event type="button" id="g"/>
</button>
<button id="abs_axis_16" label="Melee">
      <device type="keyboard" id="0" name=""/>
      <event type="button" id="v"/>
/button>
<button id="abs_axis_11" label="">
      <device type="joystick" id="0" name="Controller"/>
      <event type="button" id="9"/>
</button>
</button_map>

条件是如果按钮 id = "abs_axis_11" && name = "" :打印输出 = g,但我找不到在结果输出中删除 id = 9 的方法(使用 Python)

我的工作代码:

for event in root.findall('/button_map/button[@id="abs_axis_11"][device[@name=""]]/event'):
    button = event.get('id')
    print button

标签: pythonxml

解决方案


我不得不对下面的示例采取一些自由,因为您提供的数据和代码不是一个完整的工作示例(为了将来参考,请尝试按照这些说明进行操作)。

假设:

  • 您正在使用该xml.etree.ElementTree模块
  • 您提供的 XML 片段是您正在解析的整个消息的子集

基于这些假设,我整理了以下内容:

#!/usr/bin/python

import xml.etree.ElementTree as ET

XML_DATA = """
<root>
  <button_map>
    <button id="abs_axis_11" label="">
      <device type="keyboard" id="0" name=""/>
      <event type="button" id="g"/>
    </button>
    <button id="abs_axis_16" label="Melee">
      <device type="keyboard" id="0" name=""/>
      <event type="button" id="v"/>
    </button>
    <button id="abs_axis_11" label="">
      <device type="joystick" id="0" name="Controller"/>
      <event type="button" id="9"/>
    </button>
  </button_map>
</root>
"""

tree = ET.ElementTree(ET.fromstring(XML_DATA))
for event in tree.findall(
    './button_map/button[@id="abs_axis_11"]/device[@name=""]/../event'):
  print "Result: %s" % (event)
  print "Event ID: %s" % event.get('id')

这个脚本的输出是:

$ python python-xml.py
Result: <Element 'event' at 0x7efd53f8c610>
Event ID: g

以下是有关您的 XPath 查询的一些提示:

  • device是子元素而不是 的属性button。因此,我将其从括号中删除(这invalid predicate对我造成了错误,并将其指定为层次结构中的一个元素
  • 由于上述原因,我曾经..导航到device (ie button) 的父元素,然后向下导航到它的子元素event

推荐阅读