【问题标题】:iterparse is throwing 'no element found: line 1, column 0' and I'm not sure whyiterparse 抛出“找不到元素:第 1 行,第 0 列”,我不知道为什么
【发布时间】: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:

  1. 我知道我不是第一个提出这个问题的人,但没有其他线程回答我的问题。如果我错了,请提供适当的线程。
  2. 如果您对使用其他模块有建议,请不要将它们放在答案中。添加评论。

谢谢

【问题讨论】:

  • Twisted 已经在 twisted.words 中包含一些流解析 XML 内容,用于解析 XMPP。你可能想看看twistedmatrix.com/documents/current/api/…
  • 我知道我正在尝试重新发明轮子。在我在这里发布问题之前,我需要找到一种更好的方法来解析 Twisted 网站上的所有文档。生活和学习
  • 天哪,亲爱的 jeebus XmlStream 你一直都在哪里:D 感谢 Glyph! XmlStream 是流式传输 XML 的方式。

标签: python xml iterparse


【解决方案1】:

即使你写完后你关闭了文件,文件位置指向最后一个位置。所以你必须使用 seek 命令移动文件 pos fd.seek(0) 现在您可以使用 et.parse 命令打开并解析文件了。

【讨论】:

    【解决方案2】:

    文件对象和类文件对象有一个文件位置。一旦它被读/写,文件位置就会前进。在将文件对象传递给etree.iterparse 之前,您需要更改文件位置(使用&lt;file_object&gt;.seek(..)),以便它可以从文件开头读取。

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

    【讨论】:

    • 我知道我不知道 io 位置已“移动”(我有点想但没想到 seek(0) 缓冲区)。谢谢你。我会接受您的回答,因为它确实满足我的问题中的要求,但对于所有与流式 XML + Twisted 有类似问题的人,请使用 XmlStream (twisted.words.xish.xmlstream)
    猜你喜欢
    • 2011-11-08
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多