2009-07-16 17 views
6

Estoy tratando de analizar XML con Python, pero no llegar muy lejos. Creo que se debe al árbol XML incorrecto que devuelve esta API.xml.parsers.expat.ExpatError al analizar XML

Así que esto es lo que es devuelto por la solicitud GET:

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

La petición GET va aquí:

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

Este es el código Python que estoy usando sin ninguna suerte:

import urllib 
from xml.dom import minidom 

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

print code[0].data 

Y esta es la respuesta que recibo:

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

Lo que necesito hacer es recuperar el valor dentro del elemento <codigo> y colocarlo en una variable (lo mismo para los demás).

+0

¿No debería ser eso "code = xml.getElementsByTagName ..."? – Svante

+0

Vaya, sin embargo, la secuencia de comandos falla cuando se trata de analizar. Como Greg señaló por un XML no válido, sin embargo no puedo controlar el contenido del XML ... – mistero

+0

aún no estoy tan en minidom, pero no puedo encontrar ningún lugar en la documentación que diga que un nodo elemento tiene una variable de datos. los objetos de comentario tienen eso, pero eso no es un comentario. ¿No deberías estar usando nodeValue? – Victor

Respuesta

13

El principal problema aquí es que el código XML devuelto por ese servicio no incluye un nodo raíz, que no es válido. Lo arreglé simplemente envolviendo la salida en un nodo <root>.

import urllib 
from xml.etree import ElementTree 

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

print codigo 

Puede usar el analizador que desee, pero aquí utilicé ElementTree para obtener el valor.

4

Un documento XML consta de uno elemento de documento de nivel superior, y luego múltiples subelementos. Su fragmento XML contiene múltiples elementos de nivel superior, lo cual no está permitido por el estándar XML.

intenta volver algo como:

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

he envuelto toda la respuesta de una etiqueta <result>.

+0

El problema es que no tengo control sobre el archivo XML. Si miras la respuesta que obtienes al visitar la URL que publiqué en la parte superior, eso es todo con lo que tengo que trabajar. Si no es posible con XML, ¿cómo podría hacerlo? Gracias, Max – mistero

+1

En ese caso, tome la respuesta que obtiene de la URL usando 'url.read()', coloque una etiqueta apropiada como '' y '' alrededor de ella, * luego * páselo a la función 'minidom.parseString()'. –

Cuestiones relacionadas