Search code examples
pythonxmlelementtreefindall

Parsing XML in Python with ElementTree - findall()


I'm using the documentation here to try to get only the values (address , mask ) for certain elements.

This is an example of the structure of my XML:

    <?xml version="1.0" ?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:52622325-b136-40cf-bc36-85332e25b6f3" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
    <data>
            <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
                    <interface>
                            <GigabitEthernet>
                                    <name>1</name>
                                    <ip>
                                            <address>
                                                    <primary>
                                                            <address>192.168.40.30</address>
                                                            <mask>255.255.255.0</mask>
                                                    </primary>
                                            </address>
                                    </ip>
                                    <logging>
                                            <event>
                                                    <link-status/>
                                                    </event>
                                            </logging>
                                            <mop>
                                                    <enabled>false</enabled>
                                                    <sysid>false</sysid>
                                            </mop>
                                            <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                                                    <auto>true</auto>
                                            </negotiation>
                                    </GigabitEthernet>
                                    <GigabitEthernet>
                                            <name>2</name>
                                            <ip>
                                                    <address>
                                                            <primary>
                                                                    <address>10.10.10.1</address>
                                                                    <mask>255.255.255.0</mask>
                                                            </primary>
                                                    </address>
                                            </ip>
                                            <logging>
                                                    <event>
                                                            <link-status/>
                                                    </event>
                                            </logging>
                                            <mop>
                                                    <enabled>false</enabled>
                                                    <sysid>false</sysid>
                                            </mop>
                                            <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                                                    <auto>true</auto>
                                            </negotiation>
                                    </GigabitEthernet>
                                    <GigabitEthernet>
                                            <name>3</name>
                                            <ip>
                                                    <address>
                                                            <primary>
                                                                    <address>30.30.30.1</address>
                                                                    <mask>255.255.255.0</mask>
                                                            </primary>
                                                    </address>
                                            </ip>
                                            <logging>
                                                    <event>
                                                            <link-status/>
                                                    </event>
                                            </logging>
                                            <mop>
                                                    <enabled>false</enabled>
                                                    <sysid>false</sysid>
                                            </mop>
                                            <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                                                    <auto>true</auto>
                                            </negotiation>
                                    </GigabitEthernet>
                                    <GigabitEthernet>
                                            <name>4</name>
                                            <logging>
                                                    <event>
                                                            <link-status/>
                                                    </event>
                                            </logging>
                                            <mop>
                                                    <enabled>false</enabled>
                                                    <sysid>false</sysid>
                                            </mop>
                                            <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                                                    <auto>true</auto>
                                            </negotiation>
                                    </GigabitEthernet>
                            </interface>
                    </native>
            </data>

Working off this example in the documentation, I've tried something like this:

import xml.etree.ElementTree as ET
tree = ET.parse("C:\\Users\\Redha\\Documents\\test_network\\interface123.xml")
root = tree.getroot()

for i in root.findall('native'):  
  print(i.tag)

But it returns nothing . I've tried other things to no success. Any ideas? All advice appreciated. Thank you!


Solution

  • Consider using namespaces when referencing XML elements:

    import xml.etree.ElementTree as ET
    
    # declare XML namespaces
    namespaces = {'native': 'http://cisco.com/ns/yang/Cisco-IOS-XE-native'}
    
    tree = ET.parse("C:\\Users\\Redha\\Documents\\test_network\\interface123.xml")
    root = tree.getroot()
    
    # call findall() using previously created namespaces map
    for i in root.findall('.//native:native', namespaces):  
      print(i.tag)