Форум сайта python.su
0
Дорогие коллеги, вновь прошу помощи зала.
Разбираю 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>
) поток на куски в соответствии с открывающими и закрывающими тегами (выделил абзацами) и выдавать парсеру по 1 корневому тэгу за раз.Отредактировано pmus (Май 27, 2013 11:24:02)
Офлайн
0
Неужели никто не может подсказать? Эксперты, ау, помогите!
Офлайн
33
pmusА зачем?
Есть большое желание распилить
Офлайн
0
Дело в том, что у меня есть внешняя 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]()

Отредактировано pmus (Май 28, 2013 14:11:56)
Офлайн
33
Данные не могут быть непрерывными в принципе, они всегда идут порциями - исходя из низкоуровневых протоколов передачи данных.
Любая порция данных в потоке всегда завершается закрывающим нужным тэгом?
Если да, то проверять его на нужный.
Если нет, что будет означать: буфер так выдает пакеты, следовательно, нужно накапливать в своем буфере и анализировать посимвольно до момента, когда встретиться закрывающий символ “>”.
Потом вернуться по строке назад до начала закрывающего тага и проверить его на соответствие нужному.
Если нужных тэгов немного, то можно их хранить в списке и проверять целиком на совпадение:
1. встретили >
2. прошлись по списку известных тэгов и сравнили последние tag.length() символов на совпадение
3. вырезали
Понятно, что вырезать нужно так, что первым в буфере всегда был открывающий тэг.
Об алгоритме. Это это вообще не касается Питона, так пишут трансляторы, например, для некоторых грамматик.
Отредактировано Lexander (Май 28, 2013 15:03:04)
Офлайн
0
Lexander
Данные не могут быть непрерывными в принципе, они всегда идут порциями
Lexander
Любая порция данных в потоке всегда завершается закрывающим нужным тэгом?Если да, то проверять его на нужный.
Отредактировано pmus (Май 28, 2013 15:10:39)
Офлайн
33
Используйте строковые функции, а не lxml.
Офлайн
0
Lexander, большое спасибо за подсказки!
Проблему решил, но иначе.
Отредактировано pmus (Май 30, 2013 14:13:35)
Офлайн