2

sudsライブラリを使用して、Python 2.6 で SOAP Web サービスを実装しようとしています。これはうまく機能していますが、出力をlxmlで解析しようとすると問題が発生しました。

Suds はsuds.sax.text.Text、SOAP サービスからの応答でオブジェクトを返します。このsuds.sax.text.Textクラスは、Python 組み込みUnicode クラスのサブクラスです。本質的に、これは次の Python ステートメントに匹敵します。

u'<?xml version="1.0" encoding="utf-8" ?><root><lotsofelements \></root>'

XML 宣言が正しい場合、コンテンツは UTF-8 でエンコードされているため、Python Unicode オブジェクトではないため、これは矛盾しています (UCS4 などの内部エンコーディングで格納されているため)。

lxml は、文書化されているように、これを解析することを拒否します。これは、どのエンコーディングとして解釈すべきかについて明確な答えがないためです。

私が見ているように、この束縛から抜け出す方法は 2 つあります。

  1. エンコーディング<?xml>を含む宣言を取り除きます。
  2. 指定されたエンコーディングを使用して、Suds からの出力をバイト文字列に変換します。

現在、Web サービスから受信しているデータは ASCII の範囲内にあるため、どちらの方法でも機能しますが、どちらも私には醜いハッキングのように感じられます。より広い範囲の Unicode 文字を必要とするデータを受信します。

良いアイデアはありますか?私がこの立場にいる最初の人だとは想像できません…</p>

4

2 に答える 2

2

あなたとlxmlは正しいです。有効な XML ドキュメントは、<?xml .....ヘッダーで宣言されているようにエンコードされたバイト ストリームでなければなりません (デフォルト: UTF-8)。

3 番目のオプションをお勧めします。エンコーディング宣言を省略し、バージョンをそこに残す XML ヘッダーを使用して Unicode のままにします (将来的に安全です)。これにより、lxml が適切な状態に保たれ、再度エンコードするオーバーヘッドが回避されます。

また、泡のサイトで穏やかな調査を行い、ソースを調べてみることをお勧めします.

于 2010-03-16T21:54:50.427 に答える
1

うーん、私は現在、最初の Suds ベースのソリューションを実装しており、lxml を使用して応答を問題なく解析していますが、これは、かなり率直でばかげた方法で行っていることが原因である可能性があると思います。私のコードは次のようになります。

try:
    result = self.client.service.ExportOwnersDetails(fAccess=self.access_id, fParams=params)
except URLError:
    # TODO: Log timeout here, handle
    return
response = str(result.fReturn)

if len(response) == 0 or response.find('<?xml ') == -1:
    # TODO: Log import error here, handle
    return
response = StringIO(response)
xml = etree.parse(response)

私が言ったように、あまり賢くはありません (もちろん、まだログを記録する必要があります) が、それが私のアプローチです。fAccess、fParams、fReturn のナンセンスは、私が統合しているサードパーティ プロバイダーの命名規則です。

于 2010-03-16T21:30:42.267 に答える