pythonxmlelementtree

trying to pull an value out of xml using xml.etree.ElementTree


I have the following xml:

<multi-routing-engine-results>
    <multi-routing-engine-item>
        <re-name>node0</re-name>
        <source-resource-usage-pool-information>
            <resource-usage-entry style="all-pat-pool">
                <resource-usage-pool-name>pool_192_168_1_113</resource-usage-pool-name>
                <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <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-total-address>1</resource-usage-total-address>
                <resource-usage-total-used>7741</resource-usage-total-used>
                <resource-usage-total-avail>56771</resource-usage-total-avail>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-usage>11%</resource-usage-total-usage>
            </resource-usage-entry>
            <resource-usage-entry style="all-pat-pool">
                <resource-usage-pool-name>pool_192_168_1_114</resource-usage-pool-name>
                <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-peak-usage>8%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="1734024324">2024-12-12 11:25:24 CST</resource-usage-peak-date-time>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-total-used>2520</resource-usage-total-used>
                <resource-usage-total-avail>61992</resource-usage-total-avail>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-usage>3%</resource-usage-total-usage>
            </resource-usage-entry>
            <resource-usage-entry style="all-pat-pool">
                <resource-usage-pool-name>gos_src_pool_207_195_114_101</resource-usage-pool-name>
                <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-peak-usage>32%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="1733419670">2024-12-05 11:27:50 CST</resource-usage-peak-date-time>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-total-used>15115</resource-usage-total-used>
                <resource-usage-total-avail>49397</resource-usage-total-avail>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-usage>23%</resource-usage-total-usage>
            </resource-usage-entry>
            <resource-usage-entry style="all-pat-pool">
                <resource-usage-pool-name>gos_src_pool_207_195_114_103</resource-usage-pool-name>
                <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                <resource-usage-peak-usage>19%</resource-usage-peak-usage>
                <resource-usage-peak-date-time seconds="1739283197">2025-02-11 08:13:17 CST</resource-usage-peak-date-time>
                <resource-usage-total-address>1</resource-usage-total-address>
                <resource-usage-total-used>7920</resource-usage-total-used>
                <resource-usage-total-avail>56592</resource-usage-total-avail>
                <resource-usage-total-total>64512</resource-usage-total-total>
                <resource-usage-total-usage>12%</resource-usage-total-usage>
            </resource-usage-entry>
        </source-resource-usage-pool-information>
    </multi-routing-engine-item>
</multi-routing-engine-results>

then I tried to parse out all the pool_192_168_1_ valuesbut this fails and returns nothing, any ideas?

outputxml1 = etree.tostring(rpc_xml, encoding='unicode')
root = ET.fromstring(outputxml1)

x = 1
for item in root.findall('./multi-routing-engine-results/multi-routing-engine-item/re-name/source-resource-usage-pool-information/resource-usage-pool-name'):
 print(str(item))
 x = x + 1

Solution

  • Such a flat xml structure is ideal for pandas. Than you can write the table data to .csv or to Excel:

    import pandas as pd
    
    xml_ = """<multi-routing-engine-results>
        <multi-routing-engine-item>
            <re-name>node0</re-name>
            <source-resource-usage-pool-information>
                <resource-usage-entry style="all-pat-pool">
                    <resource-usage-pool-name>pool_192_168_1_113</resource-usage-pool-name>
                    <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                    <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                    <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-total-address>1</resource-usage-total-address>
                    <resource-usage-total-used>7741</resource-usage-total-used>
                    <resource-usage-total-avail>56771</resource-usage-total-avail>
                    <resource-usage-total-total>64512</resource-usage-total-total>
                    <resource-usage-total-usage>11%</resource-usage-total-usage>
                </resource-usage-entry>
                <resource-usage-entry style="all-pat-pool">
                    <resource-usage-pool-name>pool_192_168_1_114</resource-usage-pool-name>
                    <resource-usage-total-pool-num>57</resource-usage-total-pool-num>
                    <resource-usage-port-ol-factor>1</resource-usage-port-ol-factor>
                    <resource-usage-peak-usage>8%</resource-usage-peak-usage>
                    <resource-usage-peak-date-time seconds="1734024324">2024-12-12 11:25:24 CST</resource-usage-peak-date-time>
                    <resource-usage-total-address>1</resource-usage-total-address>
                    <resource-usage-total-used>2520</resource-usage-total-used>
                    <resource-usage-total-avail>61992</resource-usage-total-avail>
                    <resource-usage-total-total>64512</resource-usage-total-total>
                    <resource-usage-total-usage>3%</resource-usage-total-usage>
                </resource-usage-entry>
            </source-resource-usage-pool-information>
        </multi-routing-engine-item>
    </multi-routing-engine-results>"""
    
    df = pd.read_xml(xml_, xpath= ".//resource-usage-entry")
    print(df)
    

    And if you need the seconds attributes too:

    a = pd.read_xml(xml_, xpath= ".//resource-usage-entry")
    b = pd.read_xml(xml_, xpath= ".//resource-usage-peak-date-time[@seconds]")
    df = pd.merge(a, b)
    print(df)
    

    With xml.etree.ElementTree:

    import xml.etree.ElementTree as ET
    root = ET.parse("example.xml").getroot()
    
    for elem in root.findall(".//resource-usage-pool-name"):
        print(f"{elem.tag}: {elem.text:>40}")
    

    Output:

    resource-usage-pool-name:                       pool_192_168_1_113
    resource-usage-pool-name:                       pool_192_168_1_114
    resource-usage-pool-name:             gos_src_pool_207_195_114_101
    resource-usage-pool-name:             gos_src_pool_207_195_114_103