Анализ потоковой передачи XML с использованием XMLPullParser в Python

я впервые задаю вопрос здесь, и я новичок, поэтому извините, если мой вопрос покажется кому-то глупым. Я работаю над потоковой передачей данных с машины:

requests.get('http://IP:port/sample?interval=0&heartbeat=1000', stream = True)

и я получаю данные в XML. Это структура данных XML:

b'--9bc1ad19bf9e3b4049ab7e4f78dda451'
b'Content-type: text/xml'
b'Content-length: 15560'
b'<?xml version="1.0" encoding="UTF-8"?>'
b'<MTConnectStreams xmlns:m="urn:mtconnect.org:MTConnectStreams:1.3"  xmlns="urn:mtconnect.org:MTConnectStreams:1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mtconnect.org:MTConnectStreams:1.3 http://www.mtconnect.org/schemas/MTConnectStreams_1.3.xsd">'
b'  <Header creationTime="2016-12-01T17:58:48Z" sender="MAZATROL-PC" instanceId="1480604825" version="1.3.0.17" bufferSize="131072" nextSequence="1301" firstSequence="1" lastSequence="42044"/>'
b'  <Streams>'
b'    <DeviceStream name="Mazak" uuid="Mazak">'
b'      <ComponentStream component="Controller" name="controller" componentId="cont">'
b'        <Samples>'
b'          <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:45:15.662995Z" name="total_time" sequence="1214" subType="x:TOTAL">3104040</AccumulatedTime>'
b'          <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:46:16.452858Z" name="total_time" sequence="1243" subType="x:TOTAL">3104101</AccumulatedTime>'
b'          <AccumulatedTime dataItemId="yltime" timestamp="2016-12-01T15:47:17.331808Z" name="total_time" sequence="1272" subType="x:TOTAL">3104162</AccumulatedTime>'
b'          <PathFeedrateOverride dataItemId="pfo" timestamp="2016-12-01T15:33:27.042482Z" name="Fovr" sequence="899" subType="ACTUAL">0</PathFeedrateOverride>'
b'          <PathFeedrateOverride dataItemId="pfr" timestamp="2016-12-01T15:30:26.700817Z" name="Frapidovr" sequence="803" subType="RAPID">0</PathFeedrateOverride>'
b'          <PathFeedrateOverride dataItemId="pfr" timestamp="2016-12-01T15:30:42.685031Z" name="Frapidovr" sequence="810" subType="RAPID">0</PathFeedrateOverride>'

Меня интересует только получение некоторой информации из строк, содержащих dataItemId. Я сделал это только для печати данных:

for line in r.iter_lines():
    if b'dataItemId' in line:
            print(line)

Знание этой скорости действительно важно, поскольку мы хотим, чтобы данные в реальном времени были доступны в базе данных AWS. Я потерялся в том, как мне лучше разобрать. Из того, что я обнаружил, использование XmlPullParser — лучший способ анализа потоковых данных без блокировки. Однако я не знаю, какими должны быть «начало» и «конец». Я действительно не понимаю, как мне действовать, не теряя никаких данных и гарантируя, что я все анализирую. Я думал о том, чтобы иметь поток, который получает данные, другой, который анализирует данные с помощью XmlPullParser, как только данные помещаются в формат json и отправляются, строка удаляется из дерева. Но поскольку у меня нет древовидной структуры с дочерними узлами, если я хочу анализировать только строки с dataItemId, я не совсем понимаю, как это должно работать. Ваша помощь высоко ценится. Спасибо


person Wafa    schedule 01.12.2016    source источник
comment
Вы хотите получить только определенный тег. Что вы имеете в виду, что такое «начало» и «конец»? Знаете ли вы, что появляется, когда вы должны закончить синтаксический анализ? т.е. вы можете отметить, когда ваш файл заканчивается?   -  person themistoklik    schedule 01.12.2016
comment
Во время потоковой передачи мы собираем данные, пока машина работает. Поэтому, если машина не выключена, я продолжаю получать данные и анализировать их. Я имел в виду это: parser = etree.XMLPullParser(events=('start', 'end'))   -  person Wafa    schedule 02.12.2016
comment
Вы пытались запустить событие, чтобы оно было тегом, который вы хотели, а конец - пустой строкой, и потерпели неудачу? Что произойдет, если вы установите эти два события? Вы также слышали о парсинге SAX?   -  person themistoklik    schedule 02.12.2016
comment
dataItemId не является тегом, верно? Насколько я понимаю, тег — это то, что появляется после ‹ . Поправьте меня если я ошибаюсь. Я попробую сделать то, что вы предложили, но тег может измениться, так как сервер отправляет данные только тогда, когда у него есть новый. Конечно, в чем я уверен, так это в том, что должен быть dataItemId. Как я могу поставить это как начальное событие?   -  person Wafa    schedule 02.12.2016
comment
В качестве тега, который вы хотели, я имею в виду, например, «Образцы», если вы можете быть уверены, что все элементы, которые вы хотите, попадут под этот тег. Это всегда один и тот же формат, верно? В качестве конечного тега я бы выбрал тот, который всегда появляется после нужного мне контента. Вы также упоминаете удаления из дерева. Вы хотите сохранить весь XML в памяти или просто извлечь нужные данные?   -  person themistoklik    schedule 02.12.2016
comment
Два тега, которые, как я уверен, содержат нужные мне данные, являются либо образцом, либо событием. Я не знаю, можно ли его использовать или как стартовое событие.   -  person Wafa    schedule 02.12.2016
comment
Поскольку это потоковая передача, хранение всего может быть не лучшим вариантом. поэтому после обработки данных, то есть отправки их в облачную базу данных, нет необходимости их хранить.   -  person Wafa    schedule 02.12.2016
comment
что ты в итоге сделал?   -  person themistoklik    schedule 02.12.2016


Ответы (1)


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

if element.tag=="tag1" or element.tag=="tag2"

Вы также можете проверить SAX и следовать той же логике. Если вы делаете это с учетом скорости, профилируйте его и сохраните реализацию, которая наилучшим образом соответствует вашим потребностям в скорости и пространстве.

Также см. этот сообщение

person themistoklik    schedule 01.12.2016