ElementTree:使用 findall 提取属性值并将值附加到列表

问题描述 投票:0回答:1

想要从内部标签中提取名称属性的值,并且如果存在组值,则将组名称附加到名称标签。我尝试使用 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']
python xml elementtree
1个回答
0
投票

这应该会向您显示所需的列表:

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)
© www.soinside.com 2019 - 2024. All rights reserved.