2009-07-16 6 views
6

私はPythonでXMLを解析しようとしていますが、それほど遠くには達していません。私は、このAPIが返す間違ったXMLツリーが原因だと思います。XMLの解析時にxml.parsers.expat.ExpatError

だから、これはGETリクエストによって返されるものです:GETリクエストをここに

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

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

+0

うわー、yehにもかかわらず、スクリプトは解析に失敗します。グレッグが無効なXMLのために指摘したように、しかし、私はXMLの内容を制御することはできません... – mistero

+0

私は実際にはまだミニドームではありませんが、要素にはデータ変数があります。コメントオブジェクトにはコメントがありますが、コメントではありません。 nodeValueを使用してはいけませんか? – Victor

答えて

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文書は、1つの最上位レベルの文書要素と複数のサブ要素で構成されています。 XMLフラグメントには複数の最上位要素が含まれていますが、これはXML標準では許可されていません。私は<result>タグに応答全体をラップしている

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

のようなものを返してみてください。

+0

問題は、私はXMLファイルを制御できないということです。私が上に投稿したURLを訪れたときに得た応答を見れば、それだけで十分です。 XMLでできない場合、どうすればいいのですか? ありがとう、 最大 – mistero

+1

その場合は、URLから取得した応答を 'url.read()'を使って取り出し、 ''と ''のような適切なタグを入れて*に渡します'minidom.parseString()'関数です。 –