У меня проблема с анализом непрерывного потока (нескольких) 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))
Все работает отлично ... однако for
loop in iparse
выполняет итерацию по всему документу каждый раз.Возможно ли для iparse
построить и выполнить итерацию по одному правильно сформированному теговому узлу (событию), когда он появляется вместо потока?Обратите внимание, что я не могу установить размер чанка для чтения правильно сформированного пакета.Я мог бы использовать буфер, затем собрать пакет и отправить его на iparse
только после того, как пакет будет правильно сформирован, но это, вероятно, привело бы к нежелательной задержке?Есть ли лучший способ справиться с этим?
РЕДАКТИРОВАТЬ:
Каждое событие отличается, но содержит произвольные узлы под корнем <event>
.Ожидается, что iparse
опубликует последнее событие для произвольного числа подписчиков в графической системе аналитики в реальном времени.