【发布时间】:2014-12-05 01:32:30
【问题描述】:
我有一个网络应用程序(使用 Twisted),它通过 Internet 接收 xml 块(因为整个 xml 可能不会在一个数据包中完整地出现)。我的想法是慢慢构建收到的 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 列'
我无法绕过它。当第二个示例中的 stringIO 与第一个代码示例中的 stringIO 内容相同时,为什么会出现该错误?
ps:
- 我知道我不是第一个提出这个问题的人,但没有其他线程回答我的问题。如果我错了,请提供适当的线程。
- 如果您对使用其他模块有建议,请不要将它们放在答案中。添加评论。
谢谢
【问题讨论】:
-
Twisted 已经在 twisted.words 中包含一些流解析 XML 内容,用于解析 XMPP。你可能想看看twistedmatrix.com/documents/current/api/…
-
我知道我正在尝试重新发明轮子。在我在这里发布问题之前,我需要找到一种更好的方法来解析 Twisted 网站上的所有文档。生活和学习
-
天哪,亲爱的 jeebus XmlStream 你一直都在哪里:D 感谢 Glyph! XmlStream 是流式传输 XML 的方式。