インターネット経由で 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:
- これを尋ねたのは私が初めてではないことはわかっていますが、私の質問に答えたスレッドは他にありません。私が間違っている場合は、適切なスレッドを提供してください。
- 他のモジュールを使用するための提案がある場合は、それらを回答に含めないでください。コメントを追加します。
ありがとう