Сборка / анализ XML-документа из потокового потока в Python - PullRequest
3 голосов
/ 04 августа 2011

У меня проблема с анализом непрерывного потока (нескольких) 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 опубликует последнее событие для произвольного числа подписчиков в графической системе аналитики в реальном времени.

1 Ответ

0 голосов
/ 05 августа 2011

Вы можете взглянуть на разбор фида в lxml.etree.Тем не менее, вы все еще будете сталкиваться с проблемами, так как ваш документ постоянно растет.

Разделены ли капли XML символами новой строки?Если это так, я предлагаю вам буферизировать до тех пор, пока вы не нажмете новую строку, а затем отправить каждую строку в анализатор xml.* La Twisted's LineReceiver .

На самом деле, если бы это был я, я бы написал это приложение на Twisted .Склеивание сетевых сервисов является для меня распространенным случаем.

...