python - Using xml.etree.ElementTree to extract values not working - Stack Overflow

here is the XML:<multi-routing-engine-results><multi-routing-engine-item><re-name>no

here is the XML:

<multi-routing-engine-results>
    <multi-routing-engine-item>
        <re-name>node0</re-name>
        <source-resource-usage-pool-information>
            <resource-usage-entry style="pat-pool">
                <resource-usage-pool-name>gos_src_pool_198_169_34_113</resource-usage-pool-name>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-used>2501</resource-usage-total-used>
                <resource-usage-total-avail>62011</resource-usage-total-avail>
                <resource-usage-total-usage>3%</resource-usage-total-usage>
                <resource-usage-peak-usage>21%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="1736272550">2025-01-07 11:55:50 CST</resource-usage-peak-date-time>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-address>198.169.34.113</resource-usage-address>
                <resource-usage-factor-index>0</resource-usage-factor-index>
                <resource-usage-port-range>Single Ports</resource-usage-port-range>
                <resource-usage-used>2501</resource-usage-used>
                <resource-usage-avail>59963</resource-usage-avail>
                <resource-usage-total>62464</resource-usage-total>
                <resource-usage-usage>4%</resource-usage-usage>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-factor-index>-</resource-usage-factor-index>
                <resource-usage-port-range>Alg Ports</resource-usage-port-range>
                <resource-usage-used>0</resource-usage-used>
                <resource-usage-avail>2048</resource-usage-avail>
                <resource-usage-total>2048</resource-usage-total>
                <resource-usage-usage>0%</resource-usage-usage>
            </resource-usage-entry>
        </source-resource-usage-pool-information>
    </multi-routing-engine-item>
    <multi-routing-engine-item>
        <re-name>node1</re-name>
        <source-resource-usage-pool-information>
            <resource-usage-entry style="pat-pool">
                <resource-usage-pool-name>gos_src_pool_198_169_34_113</resource-usage-pool-name>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-used>2585</resource-usage-total-used>
                <resource-usage-total-avail>61927</resource-usage-total-avail>
                <resource-usage-total-usage>4%</resource-usage-total-usage>
                <resource-usage-peak-usage>0%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="0">1969-12-31 18:00:00 CST</resource-usage-peak-date-time>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-address>198.169.34.113</resource-usage-address>
                <resource-usage-factor-index>0</resource-usage-factor-index>
                <resource-usage-port-range>Single Ports</resource-usage-port-range>
                <resource-usage-used>2585</resource-usage-used>
                <resource-usage-avail>59879</resource-usage-avail>
                <resource-usage-total>62464</resource-usage-total>
                <resource-usage-usage>4%</resource-usage-usage>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-factor-index>-</resource-usage-factor-index>
                <resource-usage-port-range>Alg Ports</resource-usage-port-range>
                <resource-usage-used>0</resource-usage-used>
                <resource-usage-avail>2048</resource-usage-avail>
                <resource-usage-total>2048</resource-usage-total>
                <resource-usage-usage>0%</resource-usage-usage>
            </resource-usage-entry>
        </source-resource-usage-pool-information>
    </multi-routing-engine-item>
</multi-routing-engine-results>

Now I find what I need to extract is: 'resource-usage-pool-name','resource-usage-address','resource-usage-usage'

using this code:

 root2 = ET.fromstring(output3)
 n = 0
 contents = ['resource-usage-pool-name','resource-usage-address','resource-usage-usage']
 for elem in root.findall(".//resource-usage-entry/*"):
    for con in elem.iter():
        if con.tag in contents:
            if con.tag == 'resource-usage-pool-name':
               rpn.append(elem.text)
            if con.tag == 'resource-usage-address':
               rua.append(elem.text)
            if con.tag == 'resource-usage-usage':
               ruu.append(elem.text.replace("%",""))

f.close()
fxml.close()

x = len(rpn)
y = len(rua)
z = len(ruu)

print("rpn x:" + str(x))
print("ruu y:" + str(y))
print("rua z:" + str(z))

but the output I get is

rpn x:2
ruu y:0
rua z:0
poolalert:0
poolalert:0
[root@RHEL8-20230921 junos-pyezP311]#

so for some reason 'resource-usage-address','resource-usage-usage' are not getting pulled into their array, any ideas?

here is the XML:

<multi-routing-engine-results>
    <multi-routing-engine-item>
        <re-name>node0</re-name>
        <source-resource-usage-pool-information>
            <resource-usage-entry style="pat-pool">
                <resource-usage-pool-name>gos_src_pool_198_169_34_113</resource-usage-pool-name>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-used>2501</resource-usage-total-used>
                <resource-usage-total-avail>62011</resource-usage-total-avail>
                <resource-usage-total-usage>3%</resource-usage-total-usage>
                <resource-usage-peak-usage>21%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="1736272550">2025-01-07 11:55:50 CST</resource-usage-peak-date-time>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-address>198.169.34.113</resource-usage-address>
                <resource-usage-factor-index>0</resource-usage-factor-index>
                <resource-usage-port-range>Single Ports</resource-usage-port-range>
                <resource-usage-used>2501</resource-usage-used>
                <resource-usage-avail>59963</resource-usage-avail>
                <resource-usage-total>62464</resource-usage-total>
                <resource-usage-usage>4%</resource-usage-usage>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-factor-index>-</resource-usage-factor-index>
                <resource-usage-port-range>Alg Ports</resource-usage-port-range>
                <resource-usage-used>0</resource-usage-used>
                <resource-usage-avail>2048</resource-usage-avail>
                <resource-usage-total>2048</resource-usage-total>
                <resource-usage-usage>0%</resource-usage-usage>
            </resource-usage-entry>
        </source-resource-usage-pool-information>
    </multi-routing-engine-item>
    <multi-routing-engine-item>
        <re-name>node1</re-name>
        <source-resource-usage-pool-information>
            <resource-usage-entry style="pat-pool">
                <resource-usage-pool-name>gos_src_pool_198_169_34_113</resource-usage-pool-name>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-used>2585</resource-usage-total-used>
                <resource-usage-total-avail>61927</resource-usage-total-avail>
                <resource-usage-total-usage>4%</resource-usage-total-usage>
                <resource-usage-peak-usage>0%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="0">1969-12-31 18:00:00 CST</resource-usage-peak-date-time>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-address>198.169.34.113</resource-usage-address>
                <resource-usage-factor-index>0</resource-usage-factor-index>
                <resource-usage-port-range>Single Ports</resource-usage-port-range>
                <resource-usage-used>2585</resource-usage-used>
                <resource-usage-avail>59879</resource-usage-avail>
                <resource-usage-total>62464</resource-usage-total>
                <resource-usage-usage>4%</resource-usage-usage>
            </resource-usage-entry>
            <resource-usage-entry style="pat-pool">
                <resource-usage-factor-index>-</resource-usage-factor-index>
                <resource-usage-port-range>Alg Ports</resource-usage-port-range>
                <resource-usage-used>0</resource-usage-used>
                <resource-usage-avail>2048</resource-usage-avail>
                <resource-usage-total>2048</resource-usage-total>
                <resource-usage-usage>0%</resource-usage-usage>
            </resource-usage-entry>
        </source-resource-usage-pool-information>
    </multi-routing-engine-item>
</multi-routing-engine-results>

Now I find what I need to extract is: 'resource-usage-pool-name','resource-usage-address','resource-usage-usage'

using this code:

 root2 = ET.fromstring(output3)
 n = 0
 contents = ['resource-usage-pool-name','resource-usage-address','resource-usage-usage']
 for elem in root.findall(".//resource-usage-entry/*"):
    for con in elem.iter():
        if con.tag in contents:
            if con.tag == 'resource-usage-pool-name':
               rpn.append(elem.text)
            if con.tag == 'resource-usage-address':
               rua.append(elem.text)
            if con.tag == 'resource-usage-usage':
               ruu.append(elem.text.replace("%",""))

f.close()
fxml.close()

x = len(rpn)
y = len(rua)
z = len(ruu)

print("rpn x:" + str(x))
print("ruu y:" + str(y))
print("rua z:" + str(z))

but the output I get is

rpn x:2
ruu y:0
rua z:0
poolalert:0
poolalert:0
[root@RHEL8-20230921 junos-pyezP311]#

so for some reason 'resource-usage-address','resource-usage-usage' are not getting pulled into their array, any ideas?

Share Improve this question asked Mar 4 at 12:48 robmrobm 1,1652 gold badges11 silver badges15 bronze badges 2
  • 1 You initialize root2 from output3, but use root to iterate over the data. – Guy Commented Mar 4 at 13:48
  • Ugggh you are right , I am a dummy i completly missed that – robm Commented Mar 4 at 14:39
Add a comment  | 

1 Answer 1

Reset to default 0

The problem could be related to how you append values to rua and ruu.

  1. You are iterating over root.findall(".//resource-usage-entry/*"), that means - elem pointing to direct child. But elem.text may not be referencing the intended child elements.
  2. When checking if con.tag you appending elem.text, here may be con as the correct element to use.
  3. Just in case in the line with replacing: there could be an error with None expressions

Try to modify in such way, I've added some comments next to fixes:

root2 = ET.fromstring(output3)
contents = ['resource-usage-pool-name', 'resource-usage-address', 'resource-usage-usage']
for elem in root2.findall(".//resource-usage-entry"):
    for child in elem:  # iterate over direct children of resource-usage-entry
        if child.tag in contents:
            if child.tag == 'resource-usage-pool-name':
                rpn.append(child.text if child.text else "")
            elif child.tag == 'resource-usage-address':
                rua.append(child.text if child.text else "")
            elif child.tag == 'resource-usage-usage':
                ruu.append(child.text.replace("%", "") if child.text else "0")  # handle None case

f.close()
fxml.close()

x = len(rpn)
y = len(rua)
z = len(ruu)

print("rpn x:", x)
print("rua y:", y)
print("ruu z:", z)

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745042463a4607893.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信