tags:

views:

679

answers:

2
+1  Q: 

Parsing XML

Hi, I am trying to parse XML with Python but not getting very far. I think it's due to wrong XML tree this API returns.

So this is what is returned by the GET request:

<codigo>3</codigo><valor></valor><operador>Dummy</operador>

The GET request goes here:

http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&amp;cliente=XX

This is the Python code I am using without any luck:

import urllib
from xml.dom import minidom

url = urllib.urlopen('http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&amp;cliente=XX')
xml = minidom.parse(url)
code = doc.getElementsByTagName('codigo')

print code[0].data

And this is the response I get:

xml.parsers.expat.ExpatError: junk after document element: line 1, column 18

What I need to do is retrieve the value inside the element codigo and place it in a variable (same for the others).

Thanks, Max

+2  A: 

An XML document consists of one top level document element, and then multiple subelements. Your XML fragment contains multiple top level elements, which is not permitted by the XML standard.

Try returning something like:

<result><codigo>3</codigo><valor></valor><operador>Dummy</operador></result>

I have wrapped the entire response in a <result> tag.

Greg Hewgill
The problem is that I don't have control over the XML file. If you look at the response you get when visiting the URL I posted on top, that is all I have to work with. If not possible with XML how could I do it?Thanks,Max
mistero
In that case, take the response you get from the URL using `url.read()`, put an appropriate tag such as `<result>` and `</result>` around it, *then* pass it to the `minidom.parseString()` function.
Greg Hewgill
+3  A: 

The main problem here is that the XML code being returned by that service doesn't include a root node, which is invalid. I fixed this by simply wrapping the output in a <root> node.

import urllib
from xml.etree import ElementTree

url = 'http://69.36.9.147:8090/clientes/SMS_API_OUT.jsp?codigo=ABCDEFGH&amp;cliente=XX'
xmldata = '<root>' + urllib.urlopen(url).read() + '</root>'
tree = ElementTree.fromstring(xmldata)
codigo = tree.find('codigo').text

print codigo

You can use whatever parser you wish, but here I used ElementTree to get the value.

sixthgear