Лучший способ для анализа XMPP-подобных потоков XML? - PullRequest
4 голосов
/ 30 апреля 2010

Я работаю над серверным приложением, которое получает данные через сокет TCP в XMPP-подобном формате XML, то есть каждый дочерний элемент элемента <root> по существу представляет один отдельный запрос (раздел). Соединение закрывается, как только </root> получено. Я действительно знаю, что должен каким-то образом использовать анализатор потоков, такой как SAX. Хотя для удобства я предпочел бы иметь древовидный интерфейс для доступа к дочерним элементам каждой строфы. (Данные, отправляемые с каждым запросом, невелики, поэтому я думаю, что имеет смысл читать каждый раздел в целом.)

Какой лучший способ реализовать это в Python (желательно v3)?

Это код, в который я хотел бы встроить его. Не стесняйтесь указывать мне совершенно другое направление для решения этой проблемы.

import socketserver
import settings

class MyServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

class MyRequestHandler(socketserver.StreamRequestHandler):
    def handle(self):
        pass

if __name__ == '__main__':
    server = MyServer((settings.host, settings.port), MyRequestHandler)
    server.serve_forever()

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Вы захотите использовать синтаксический анализатор на основе push, который генерирует события SAX. По сути, вам нужен синтаксический анализатор, который вы можете вызывать pushChunk (data) с частичным битом данных, и иметь его в качестве обработчика событий для события дочернего конечного тега первого уровня, которое генерирует ваши разделы. Затем его можно отправить в логику обработки приложения.

Если вы хотите увидеть пример этого, вот парсер экспата для libstrophe, клиентской библиотеки XMPP, которую я написал: http://github.com/metajack/libstrophe/blob/master/src/parser_expat.c

Создание целого документа для каждой строфы довольно дорого. Это можно реализовать с помощью одного экземпляра анализатора, в отличие от постоянного создания новых анализаторов документов для каждого раздела.

Если вам нужна рабочая версия Python, вы, вероятно, можете использовать или извлечь код из Twisted Words (я считаю, что twisted.words.xish).

1 голос
/ 30 апреля 2010

То, что мы сделали для Skates , заключается в том, что мы используем синтаксический анализатор Sax для создания потока, но используем этот анализатор для построения целого документа для каждого полученного раздела.

...