2014-12-19 3 views
2

Я пытаюсь проанализировать большой XML-файл, который поступает из сети в Python.Анализ частичного XML с помощью python lxml

Для того, чтобы сделать это, я получаю данные и передать его в lxml.etree.iterparse

Однако, если XML еще полностью быть отправлено, например, так:

<MyXML> 
    <MyNode foo="bar"> 
    <MyNode foo="ba 

Если я бегу etree.iterparse(f, tag='MyNode').next() I получите XMLSyntaxError в любое время, когда оно было отрезано.

Есть ли способ сделать это, чтобы я мог получить первый тег (т. Е. Первый MyNode) и получить только исключение, когда попаду в эту часть документа? (Чтобы сделать lxml действительно «потоковым» содержимым, а не читать все в начале).

ответ

2

XMLPullParser и HTMLPullParser могут удовлетворить ваши потребности. Они получают свои данные, повторяя звонки parser.feed(data). Вам все равно придется ждать, пока все данные не поступят до того, как дерево будет использоваться.

+0

Это проблематично, хотя, как данные я получаю "не может" никогда не будет полностью принят. – KimiNewt

+0

Это проблема. Начиная с python 3.4, lxml имеет [Инкрементный анализ событий] (http://lxml.de/parsing.html#incremental-event-parsing). Возможно, вы сможете отслеживать элементы элементов и фид закрытия элементов анализатора, когда ваш поток данных умирает. Это не сработало бы, если бы вы были средним элементом, хотя (' tdelaney

+0

Мне нужно поддерживать python 2.7, и мне нужно поддерживать середину, элемент тоже. – KimiNewt

0

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

+0

Ничего из этого не имеет ничего об анализе частичного XML. – KimiNewt

Смежные вопросы