如何使用elemntree访问xml中的特定标签?

时间:2019-07-17 07:42:58

标签: python xml tags

我正在尝试解析包含依赖项和参数标签的任务的XML,我想遍历该任务并获取任务名称,params,depends。 您会如何建议这样做?

我试图逐个任务地获取任务,并通过访问特定标签来获取所需的所有数据。

我尝试的

代码: 表示根目录中的元素:表示elem.findall('taskFlow')中的子元素:print(subelem.get ['name'])

<?xml version="1.0" encoding="UTF-8"?>
<job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:proactive:jobdescriptor:3.2" xsi:schemaLocation="urn:proactive:jobdescriptor:3.2 http://www.activeeon.com/public_content/schemas/proactive/jobdescriptor/3.2/schedulerjob.xsd" name="Extra_02_StartFramegrabbers" projectName="Extra_02_StartFramegrabbers">
  <description>Extra_02_StartFramegrabbers</description>
  <taskFlow>
    <task name="PrepGrabbersEnv">
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\PrepareEnvironment\PrepareEnvironment.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\Static\PrepGrabbersEnv.INI"/>
          <parameter name="computers" value="AllComputers"/>
        </parameters>
      </javaExecutable>
      <controlFlow block="none"/>
    </task>
    <task name="FrameGrabber">
      <depends>
        <task ref="NothingAfterKill"/>
      </depends>
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\FrameGrabber\FrameGrabber.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\Static\FrameGrabber.ini"/>
          <parameter name="computers" value="FramegrabberComputers"/>
          <parameter name="background" value="true"/>
        </parameters>
      </javaExecutable>
    </task>
    <task name="AutoIniFrameGrabber">
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\AutoINI\AutoIni.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\AUTOINI\FrameGrabbers.aip"/>
          <parameter name="computers" value="ControlComputer"/>
        </parameters>
      </javaExecutable>
    </task>
  </taskFlow>
</job>

1 个答案:

答案 0 :(得分:0)

见下文

import xml.etree.ElementTree as ET
import re

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:proactive:jobdescriptor:3.2" xsi:schemaLocation="urn:proactive:jobdescriptor:3.2 http://www.activeeon.com/public_content/schemas/proactive/jobdescriptor/3.2/schedulerjob.xsd" name="Extra_02_StartFramegrabbers" projectName="Extra_02_StartFramegrabbers">
  <description>Extra_02_StartFramegrabbers</description>
  <taskFlow>
    <task name="PrepGrabbersEnv">
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\PrepareEnvironment\PrepareEnvironment.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\Static\PrepGrabbersEnv.INI"/>
          <parameter name="computers" value="AllComputers"/>
        </parameters>
      </javaExecutable>
      <controlFlow block="none"/>
    </task>
    <task name="FrameGrabber">
      <depends>
        <task ref="NothingAfterKill"/>
      </depends>
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\FrameGrabber\FrameGrabber.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\Static\FrameGrabber.ini"/>
          <parameter name="computers" value="FramegrabberComputers"/>
          <parameter name="background" value="true"/>
        </parameters>
      </javaExecutable>
    </task>
    <task name="AutoIniFrameGrabber">
      <javaExecutable class="exe">
        <parameters>
          <parameter name="command" value="C:\ReplayCode\Apps\AutoINI\AutoIni.exe"/>
          <parameter name="arguments" value="C:\ReplayCode\INIFiles\AUTOINI\FrameGrabbers.aip"/>
          <parameter name="computers" value="ControlComputer"/>
        </parameters>
      </javaExecutable>
    </task>
  </taskFlow>
</job>'''
# ignore namespace
xml = re.sub(' xmlns="[^"]+"', '', xml, count=1)

root = ET.fromstring(xml)
tasks = root.findall('.//taskFlow/task')
for task in tasks:
    print('Task Name: {}'.format(task.attrib['name']))

输出

Task Name: PrepGrabbersEnv
Task Name: FrameGrabber
Task Name: AutoIniFrameGrabber