【发布时间】:2014-07-25 13:46:54
【问题描述】:
我从服务器接收 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):
import xml.etree.ElementTree as ET
text = ""
def handle_message(msg):
text += msg
try:
root = ET.fromstring("<root>" + text + "</root>")
for el in list(root):
handle_element(el)
text = ""
return True
except ET.ParseError:
return False
但是,这种方法实际上并不奏效,因为它仅在 text 意外包含格式良好的 XML 文档时调用 handle_element,但不能保证永远都是这种情况。
【问题讨论】:
-
如果你想要增量 XML 解析,你使用了错误的模块......你想要
xml.sax。将它附加到一个简单的文件类型对象,该对象缓冲来自另一端的数据,我想你会得到你想要的。etree和其他 DOM 类型的解析器希望一次加载整个文件并以原子方式处理它。或者试试 BeautifulSoup,没试过,但认为它应该可以处理这些情况。 -
好的,谢谢,我看看那两个。但为了清楚起见,我无法访问“另一端”。我只是得到那些字符串 xml 片段,这就是我所拥有的。
-
那些是非常小的块。您能否将套接字连接的缓冲区大小提高到(也许)允许一次接收整个消息?
-
@notorious 这只是一个例子,实际上它们更大。但是不,我无法保证立即传输完整的元素。我也不能保证,如果一次传输一个元素,那么在该元素之后该块不包含任何额外的和不完整的内容。
标签: python xml xml-parsing