基于同一元素中的条件属性打印属性值(XML Python)

时间:2018-06-03 20:01:36

标签: python xml

我有一个像这样的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 =&#34; abs_axis_11&#34; &安培;&安培; name =&#34;&#34; :print output = 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

1 个答案:

答案 0 :(得分:0)

我不得不对下面的示例采取一些自由,因为您提供的数据和代码不是一个完整的工作示例(供将来参考,try following these instructions)。

假设:

  • 您正在使用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的父元素 (即button)然后直到它的子元素event