2

インターネット経由で xml のチャンクを受信するネットワーク アプリケーション (Twisted を使用) があります (xml 全体が 1 つのパケットに収まらない可能性があるため)。私の考えたプロセスは、受信した xml メッセージをゆっくりと構築することです。私は xml.etree.ElementTree から iterparse に「落ち着きました」。私はいくつかのコードに手を出しましたが、次の (非 Twisted コード) は正常に動作します:

import xml.etree.ElementTree as etree
from io import StringIO

buff = StringIO(unicode('<notorious><burger/></notorious>'))

for event, elem in etree.iterparse(buff, events=('end',)):
    if elem.tag == 'notorious':
        print(etree.tostring(elem))

次に、次のコードを作成して、自分の側でデータを受信する方法をシミュレートしました。

import xml.etree.ElementTree as etree
from io import StringIO

chunks = ['<notorious>','<burger/>','</notorious>']
buff = StringIO()

for ch in chunks:
    buff.write(unicode(ch))
    if buff.getvalue() == '<notorious><burger/></notorious>':
        print("it should work now")
    try:
        for event, elem in etree.iterparse(buff, events=('end',)):
            if elem.tag == 'notorious':
                print(etree.tostring(elem))
        except Exception as e:
            print(e)

しかし、コードは吐き出します:

「要素が見つかりません: 行 1、列 0」

私はそれに頭を包むことができません。2 番目のサンプルの stringIO の内容が最初のコード サンプルの stringIO と同じであるのに、なぜそのエラーが発生するのですか?

PS:

  1. これを尋ねたのは私が初めてではないことはわかっていますが、私の質問に答えたスレッドは他にありません。私が間違っている場合は、適切なスレッドを提供してください。
  2. 他のモジュールを使用するための提案がある場合は、それらを回答に含めないでください。コメントを追加します。

ありがとう

4

2 に答える 2

3

ファイル オブジェクトとファイルのようなオブジェクトには、ファイル位置があります。読み取り/書き込みが完了すると、ファイルの位置が進みます。ファイルの先頭から読み取ることができるように<file_object>.seek(..)、ファイル オブジェクトを に渡す前に、ファイルの位置を ( を使用して) 変更する必要があります。etree.iterparse

...
buff.seek(0) # <-----
for event, elem in etree.iterparse(buff, events=('end',)):
    if elem.tag == 'notorious':
        print(etree.tostring(elem))
于 2014-12-05T02:53:33.630 に答える