我从服务器接收XML块。这些块不是完整的段,但可能看起来像这样:
chunk1 = '<el a="1" b='
chunk2 = '"2"><sub c="'
chunk3 = '3">test</sub'
chunk4 = '></el><el d='
chunk5 = '"4" e="5"></'
chunk6 = 'el>'
如何解析这个流,以便每当一个“el”元素完成时,都会调用一个函数?在
到目前为止,我采用这种方法(使用ElementTree):
^{pr2}$但是,这种方法实际上并不起作用,因为它只在text
意外地包含格式良好的XML文档时调用handle_element
,但不能保证这种情况会发生。在
您正在尝试在获得适当的XML陷阱之前创建一个XML对象(我相信您已经知道了)。基本上,您已经将所有的字符串/块连接在一起,一旦您有了完整的XML,就可以使用完整的字符串创建一个XML对象。使用拜特西奥或者斯金吉奥每当你从服务器上得到一些东西,就把它写到缓冲区,然后解析缓冲区,取出你需要的东西。在
扭曲的例子:
希望这有帮助,我们在工作中做了一些非常相似的事情,但我不记得我们是如何实现的。在
您也许可以使用ET.iterparse来增量解析XML块:
收益率
^{pr2}$ET.iterparse
的第一个参数通常是文件名或拜特西奥或StringIO对象。但是,它可以是任何具有read
方法的对象。因此,如果您创建了一个对象,其read方法从服务器读取,那么您可以将其挂接到ET.iterparse
中执行增量解析。在注意,
ET.iterparse
将使用请求的字节数调用read方法(例如read(16384)
)。如果服务器只提供给你更少的字节,那么你可以返回更少的字节,但是我不确定如果你返回的字节数超过了请求的字节数,是否会发生什么不好的事情。理想情况下,您应该能够将请求的字节数传递给服务器,并依赖服务器提供正确的字节数(或更少)。在相关问题 更多 >
编程相关推荐