Уведомления

Группа в Telegram: @pythonsu

#1 Май 26, 2013 18:15:15

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Explode для xml

Дорогие коллеги, вновь прошу помощи зала.

Разбираю 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 (Май 27, 2013 11:24:02)

Офлайн

#2 Май 28, 2013 12:31:37

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Explode для xml

Неужели никто не может подсказать? Эксперты, ау, помогите!

Офлайн

#3 Май 28, 2013 12:37:05

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Explode для xml

pmus
Есть большое желание распилить
А зачем?



Офлайн

#4 Май 28, 2013 13:24:41

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Explode для xml

Дело в том, что у меня есть внешняя 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>



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

Отредактировано pmus (Май 28, 2013 14:11:56)

Офлайн

#5 Май 28, 2013 15:02:30

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Explode для xml

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

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

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

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



Отредактировано Lexander (Май 28, 2013 15:03:04)

Офлайн

#6 Май 28, 2013 15:07:55

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Explode для xml

Lexander
Данные не могут быть непрерывными в принципе, они всегда идут порциями

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

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

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

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


Отредактировано pmus (Май 28, 2013 15:10:39)

Офлайн

#7 Май 28, 2013 15:17:41

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Explode для xml

Используйте строковые функции, а не lxml.



Офлайн

#8 Май 30, 2013 00:28:11

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Explode для xml

Lexander, большое спасибо за подсказки!

Проблему решил, но иначе.

Отредактировано pmus (Май 30, 2013 14:13:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version