我从服务器接收XML块。这些块是不完整的片段,但可以看看比如像这样:Python:解析不完整的XML块
chunk1 = '<el a="1" b='
chunk2 = '"2"><sub c="'
chunk3 = '3">test</sub'
chunk4 = '></el><el d='
chunk5 = '"4" e="5"></'
chunk6 = '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
然而,这种方法并没有真正的工作,因为它仅调用handle_element
当text
包含事故格式良好的XML文档,但不能保证这将永远如此。
如果你想增量XML解析,你使用了错误的模块......你需要'xml.sax'。附加到一个简单的文件类型的对象,从另一端缓冲数据,我想你会得到你想要的。 'etree'和其他DOM类型的解析器希望一次加载整个文件并以原子方式处理它。或尝试BeautifulSoup,还没有尝试过,但认为它应该处理这些情况。 –
好的,谢谢,我看看那两个。但要明确,我不能访问“另一端”。我只是得到那些字符串xml片断,这就是我所拥有的。 – basilikum
那些是非常小的块。你可以将套接字连接的缓冲区大小设置为(可能)允许一次接收整个消息吗? –