Найти - Пользователи
Полная версия: Explode для xml
Начало » Python для новичков » Explode для xml
1
pmus
Дорогие коллеги, вновь прошу помощи зала.

Разбираю XML, примерно такую кашу:

<tag1 a1=“xxxx”></tag1><tag2>yyy</tag2><tag3>…..

если точнее, то:

<securities><security secid="0" active="true"><seccode>RU000A0JQ201</seccode><shortname>Ст-Недв 01</shortname><decimals>2</decimals><market>1</market><sectype>BOND</sectype><opmask usecredit="yes" bymarket="no" nosplit="yes" immorcancel="yes" cancelbalance="yes"/><minstep>0.01</minstep><lotsize>1</lotsize><point_cost>10</point_cost></security></securities>

<markets><market id="1">ММВБ</market><market id="4">FORTS</market><market id="7">РТС</market><market id="8">INF</market><market id="9">XETRA</market></markets>

<candlekinds><kind><id>1</id><period>60</period><name>1 минута</name></kind><kind><id>2</id><period>300</period><name>5 минут</name></kind><kind><id>3</id><period>900</period><name>15 минут</name></kind><kind><id>4</id><period>3600</period><name>1 час</name></kind><kind><id>5</id><period>86400</period><name>1 сутки</name></kind><kind><id>6</id><period>604800</period><name>1 неделя</name></kind></candlekinds>
На абзацы разбил я сам, вручную. В оригинале это - просто непрерывные данные.

Естественно, этот “поток сознания” скармливаю парсеру (уже написан). Есть большое желание распилить (или “взорвать” как в php ) поток на куски в соответствии с открывающими и закрывающими тегами (выделил абзацами) и выдавать парсеру по 1 корневому тэгу за раз.

Как я должен делать это правильным образом? У меня from lxml import etree, objectify. Думал решить строковым перебором, но это же явно не Python way?
pmus
Неужели никто не может подсказать? Эксперты, ау, помогите!
Lexander
pmus
Есть большое желание распилить
А зачем?
pmus
Дело в том, что у меня есть внешняя dll, отвечающая за связь с сервером. Эта dll при получении данных от сервера выполняет Callback-функцию, передавая ей текстовые данные в виде XML в качестве параметра. Эти данные складываются в буферную строковую переменную, т.к. данные поступают асинхронно, часто, и самые разные. Выглядит это как сплошной поток XML-данных без заголовка, который нужно парсить.

Я написал функцию парсинга

tree = objectify.fromstring (text)
def result():
	global tree
	print tree.text
	print tree.attrib
	#и так далее...
def server_status():
	global tree
	#и так далее...
def security():
	global tree
	for s in tree.security :
		seclist.append (s.seccode)
                            secdict [s.seccode] = (
                           { 'secid' : s.get ('secid') , 'active' : s.get ('active') , 'seccode' : s.seccode ,
	#и так далее...
options = {'result' : result,
           'server_status' : server_status,
           'security' : security
}
options[tree.tag]()

естественно, ей нужно скармливать данные только с одним корневым тэгом, а у меня идет поток <tag1><tag11></tag11></tag1><tag2><tag22></tag22></tag2>
который нужно распилить до вида
<tag1><tag11></tag11></tag1>,
<tag2><tag22></tag22></tag2>



И собственно, вместо того, чтобы уже писать обработчики этих данных, я сижу и туплю в документацию по разным модулям.
Lexander
Данные не могут быть непрерывными в принципе, они всегда идут порциями - исходя из низкоуровневых протоколов передачи данных.
Любая порция данных в потоке всегда завершается закрывающим нужным тэгом?
Если да, то проверять его на нужный.

Если нет, что будет означать: буфер так выдает пакеты, следовательно, нужно накапливать в своем буфере и анализировать посимвольно до момента, когда встретиться закрывающий символ “>”.
Потом вернуться по строке назад до начала закрывающего тага и проверить его на соответствие нужному.
Если нужных тэгов немного, то можно их хранить в списке и проверять целиком на совпадение:
1. встретили >
2. прошлись по списку известных тэгов и сравнили последние tag.length() символов на совпадение
3. вырезали

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

Об алгоритме. Это это вообще не касается Питона, так пишут трансляторы, например, для некоторых грамматик.
pmus
Lexander
Данные не могут быть непрерывными в принципе, они всегда идут порциями

Я имел в виду, что в одной порции приезжает несколько корневых тэгов сразу.

Lexander
Любая порция данных в потоке всегда завершается закрывающим нужным тэгом?Если да, то проверять его на нужный.

В “порции” их несколько, закрыты они правильно, но функции lxml валятся с ошибками.

Из такого потока ‘<tag1><tag11></tag11></tag1><tag2><tag22></tag22></tag2>’ не получается даже достать значение <tag1>


Lexander
Используйте строковые функции, а не lxml.
pmus
Lexander, большое спасибо за подсказки!

Проблему решил, но иначе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB