我有一个问题,需要解析第三方通过套接字发送的连续(多个)xml文档流。套接字发送的xml流的示例为:
<?xml version="1.0"?><event><user id="1098"/><viewpage>109958</viewpage></event>
<?xml version="1.0"?><event><user id="1482"/><actions><edit>102865</edit><commit>1592356</commit></actions></event>
etc.
这是我正在使用的代码:
import socket
import xml.etree.cElementTree as etree
from StringIO import StringIO
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "IP.IP.IP.IP"
port = "8080"
addr = (host,port)
s.connect(addr)
def iparse(packet):
for _, element in etree.iterparse(packet):
print ("%s, %s" %(element.tag, element.text))
element.clear()
#if complete <event> node received, publish node
data = "<feeds>"
while 1:
chunk = s.recv(1024)
#replace the xml doc declarations as comments
data += (chunk.replace("<?","<!--")).replace("?>","-->")
iparse(StringIO(data))
事情进展得很顺利......然而,在iparse中的for循环每次都会遍历整个文档。是否有可能让iparse在流中逐个构建并遍历一个格式良好的标签节点(事件)呢?请注意,我无法设置块大小以读取格式良好的包。我可以使用缓冲区,然后构建数据包,并在数据包格式良好后才发送到iparse,但那可能会引入不必要的延迟吗?有更好的方法来处理这个问题吗?
编辑:每个事件都是独特的,但包含根下的任意节点。iparse预计将最新事件发布给实时分析图形系统中的任意数量的订阅者。