我正在尝试解析包含依赖项和参数标签的任务的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>
答案 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