Search code examples
pythonwsdlelementtreequalified-name

Parsing wsdl (retrieve namespaces from the definitions)using an Element Tree


I am trying to parse a wsdl file using ElementTree, As part of this I"d like to retrieve all the namespaces from a given wsdl definitions element.

For instance in the below snippet , I am trying to retrieve all the namespaces in the definitions tag

<?xml version="1.0"?>
<definitions name="DateService" targetNamespace="http://dev-b.handel-dev.local:8080/DateService.wsdl" xmlns:tns="http://dev-b.handel-dev.local:8080/DateService.wsdl"
  xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:myType="DateType_NS" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

My code looks like this

import xml.etree.ElementTree as ET

xml_file='<path_to_my_wsdl>'
tree = xml.parse(xml_file)
rootElement = tree.getroot()
print (rootElement.tag)       #{http://schemas.xmlsoap.org/wsdl/}definitions
print(rootElement.attrib)     #targetNamespace="http://dev-b..../DateService.wsdl"

As I understand, in ElementTree the namespace URI is combined with the local name of the element .How can I retrieve all the namespace entries from the definitions element?

Appreciate your help on this

P.S: I am new (very!) to python


Solution

  • >>> import xml.etree.ElementTree as etree
    >>> from StringIO import StringIO
    >>>
    >>> s = """<?xml version="1.0"?>
    ... <definitions
    ...   name="DateService"
    ...   targetNamespace="http://dev-b.handel-dev.local:8080/DateService.wsdl"
    ...   xmlns:tns="http://dev-b.handel-dev.local:8080/DateService.wsdl"
    ...   xmlns="http://schemas.xmlsoap.org/wsdl/"
    ...   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    ...   xmlns:myType="DateType_NS"
    ...   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    ...   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    ... </definitions>"""
    >>> file_ = StringIO(s)
    >>> namespaces = []
    >>> for event, elem in etree.iterparse(file_, events=('start-ns',)):
    ...     print elem
    ...
    (u'tns', 'http://dev-b.handel-dev.local:8080/DateService.wsdl')
    ('', 'http://schemas.xmlsoap.org/wsdl/')
    (u'soap', 'http://schemas.xmlsoap.org/wsdl/soap/')
    (u'myType', 'DateType_NS')
    (u'xsd', 'http://www.w3.org/2001/XMLSchema')
    (u'wsdl', 'http://schemas.xmlsoap.org/wsdl/')
    

    Inspired by the ElementTree documentation