我從服務器接收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
那些是非常小的塊。你可以將套接字連接的緩衝區大小設置爲(可能)允許一次接收整個消息嗎? –