Skip to content Skip to sidebar Skip to footer

Parsing Soap/xml Response In Python

I am trying to parse the below xml using the python. I do not understand which type of xml this is as I never worked on this kind of xml.I just got it from a api response form Micr

Solution 1:

This declaration is part of the start tag of the root element:

xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

It means that elements with the wsse prefix (such as BinarySecurityToken) are in the http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd namespace.

The solution is basically the same as in the answer to the linked question. It's just another namespace:

import xml.etree.ElementTree as ET

tree = ET.parse('soap.xml')    
print tree.find('.//{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}BinarySecurityToken').text

Here is another way of doing it:

import xml.etree.ElementTree as ET

ns = {"wsse": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"}
tree = ET.parse('soap.xml') 
print tree.find('.//wsse:BinarySecurityToken', ns).text

The output in both cases is my token.

See https://docs.python.org/2.7/library/xml.etree.elementtree.html#parsing-xml-with-namespaces.

Solution 2:

Creating a namespace dict helped me. Thank you @mzjn for linking that article.

In my SOAP response, I found that I was having to use the full path to the element to extract the text.

For example, I am working with FEDEX API, and one element that I needed to find was TrackDetails. My initial .find() looked like .find('{http://fedex.com/ws/track/v16}TrackDetails')

I was able to simplify this to the following:

ns = {'TrackDetails': 'http://fedex.com/ws/track/v16'}
tree.find('TrackDetails:TrackDetails',ns)

You see TrackDetails twice because I named the key TrackDetails in the dict, but you could name this anything you want. Just helped me to remember what I was working on in my project, but the TrackDetails after the : is the actual element in the SOAP response that I need.

Hope this helps someone!

Post a Comment for "Parsing Soap/xml Response In Python"