我有一个网络应用程序(使用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/

10-14 17:47