2009-07-16 217 views
6

我正在嘗試用Python解析XML,但並沒有得到很大的幫助。我認爲這是由於這個API返回錯誤的XML樹造成的。解析XML時出現xml.parsers.expat.ExpatError問題

原來這就是由GET請求返回:

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

GET請求放在這裏:

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

這是我使用沒有任何的運氣了Python代碼:

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 

這就是我得到的迴應:

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

我需要做的是檢索<codigo>元素中的值,並將它放在一個變量中(對其他變量相同)。

+0

不應該是「code = xml.getElementsByTagName ...」嗎? – Svante 2009-07-16 22:44:40

+0

糟糕的是,儘管如此,腳本在解析時失敗了。就像Greg指出的那樣,由於無效的XML,但是我無法控制XML的內容...... – mistero 2009-07-16 22:51:04

回答

13

這裏的主要問題是該服務返回的XML代碼不包含無效的根節點。我通過將輸出簡單地包裝在<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 

您可以使用任何您希望的解析器,但在這裏我使用ElementTree來獲取值。

4

一個XML文檔由一個頂層文檔元素和多個子元素組成。您的XML片段包含多個頂級元素,這是XML標準所不允許的。

,請返回類似:

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

我已經包裹在一個<result>標籤整個響應。