我有一个网络应用程序(使用twisted),它通过internet接收大块的xml(因为整个xml可能不是一个包中的全部)。我的想法是在接收到xml消息时慢慢地构建它。我已经从xml.etree.elementtree“确定”了iterparse。我已经涉猎了一些代码,以下代码(非扭曲代码)工作正常:
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'
我不能把我的头裹住。当第二个示例中的stringio与第一个代码示例中的stringio具有相同的内容时,为什么会发生此错误?
PS:
我知道我不是第一个问这个问题的人,但没有其他线索回答我的问题。如果我错了,请提供适当的线程。
如果你有其他模块使用的建议,不要把它们放在回答plz。添加注释。
谢谢
最佳答案
文件对象和类文件对象具有文件位置。一旦它被读/写,文件位置就会前进。在将文件对象传递到<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))
关于python - iterparse抛出“找不到元素:第1行,第0列”,我不确定为什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27307359/