想要从内部标签中提取名称属性的值,并且如果存在组值,则将组名称附加到名称标签。我尝试使用 xml.etree.ElementTree 进行提取,但我的代码没有给出预期的输出。
输入XML
<abtshop>
<dDirectory>dub</dDirectory>
<S>statusd</S>
<work>worklogs</work>
<custs>
<cust>nim-us</cust>
</custs>
<mileage>999</mileage>
<defaults>
<default type="mercley">
<user>dairy</user>
<exec>slm.sh</exec>
<env>
<var name="SAN_HOME">youyou-11</var>
</env>
</default>
</defaults>
<inters>
<inter name="nim_turk" first-day="20230301" historical="20220103" market="multi">
<works>
<work kind="obopay" run="jbs">
<args>
<arg name="distance">180000</arg>
</args>
</work>
<work kind="silkb" run="jbs">
<args>
<arg name="distance">180000</arg>
</args>
</work>
</works>
</inter>
<inter name="nim_us_m" first-day="20230301" historical="20220103" market="lone">
<works>
<work kind="obopay" run="jbs" groups="groupA,groupB">
<args>
<arg name="distance">120000</arg>
<arg name="jbsopt">xmas_size=1200000</arg>
<arg name="jbsopt">of_obopaying_threads=2</arg>
</args>
</work>
<work kind="silkb" run="jbs" groups="groupA,groupB">
<args>
<arg name="distance">120000</arg>
<arg name="jbsopt">xmas_size=1200000</arg>
</args>
</work>
</works>
</inter>
</inters>
</abtshop>
所需逻辑
如果工作标签具有属性组,则需要附加名称和组的值,否则仅打印名称。
<inter name="nim_us_m" first-day="20230301" historical="20220103" market="lone">
<works>
<work kind="obopay" run="jbs" groups="groupA,groupB">
喜欢
nim_us_m-groupA, nim_us_m-groupB
否则,仅打印姓名
<inter name="nim_turk" first-day="20230301" historical="20220103" market="multi">
像这样
nim_turk
我尝试了下面的代码,提取值但徒劳。
尝试过代码
tree=ET.parse('test.xml')
root = tree.getroot()
xm_subs=[]
for subn in root.findall(".//inter/works/work[@run='jbs'][@kind='obopay']/../.."):
sname=subn.attrib["name"]
for subg in root.findall(".//inter[@name='%s']/jobs/job[@run='jbs'][@kind='obopay'][@groups]" % sname):
groups=subg.attrib['groups']
for gname in groups.split(","):
sub_name=subn.attrib["name"] + "-" + gname
xm_subs.append(sub_name)
else:
xm_subs.append(subn.attrib["name"])
print xm_subs
所需输出
['nim_turk','nim_us_m-groupA','nim_us_m-groupB']
这应该会向您显示所需的列表:
import xml.etree.ElementTree as ET
root = ET.parse("test_xml.xml").getroot()
result =[]
user = ''
for elem in root.findall('.//inters'):
for name in elem:
user = name.get('name')
gr = name.find(".//work[@groups]")
if gr is not None:
l = gr.get('groups').split(',')
for u_gr in l:
comb_usr = user + '_' + u_gr
result.append(comb_usr)
else:
result.append(user)
print(result)