- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
class Source:
id = ''
values = []
arrays =[ ( 'bool_array', bool), ( 'float_array', float), ('IDREF_array', str), ('int_array', int), ('Name_array', str), ('SIDREF_array', str), ('token_array', str)]
def __init__(self, node):
self.id = node.getAttribute('id')
accessors = dict([ (accessor.getAttribute('source')[1:], (int(accessor.getAttribute('count')), int(accessor.getAttribute('stride'))) ) for technique in node.getElementsByTagName("technique_common") for accessor in technique.getElementsByTagName("accessor") ])
values = [(arrayNode.getAttribute('id'), int(arrayNode.getAttribute('count')), [array[1](v) for v in getText(arrayNode).split()]) for array in Mesh.Source.arrays for arrayNode in node.getElementsByTagName(array[0])]
self.values = [ array[2][i*accessors[array[0]][1]:(i+1)*accessors[array[0]][1]] for array in values for i in range(accessors[array[0]][0])]
<source id="Box001-lib-Position">
<float_array id="Box001-lib-Position-array" count="24">-23.296745 -46.390999 0.000000 23.296745 -46.390999 0.000000 -23.296745 46.390999 0.000000 23.296745 46.390999 0.000000 -23.296745 -46.390999 35.287621 23.296745 -46.390999 35.287621 -23.296745 46.390999 35.287621 23.296745 46.390999 35.287621</float_array>
<technique_common>
<accessor source="#Box001-lib-Position-array" count="8" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
в результате нужно получить список в виде
[[-23.296745, -46.390999, 0.0], [23.296745, -46.390999, 0.0], [-23.296745, 46.390999, 0.0], [23.296745, 46.390999, 0.0], [-23.296745, -46.390999, 35.287621], [23.296745, -46.390999, 35.287621], [-23.296745, 46.390999, 35.287621], [23.296745, 46.390999, 35.287621]]
Неделю назад начал учить питон, и для того чтоб это было совсем полезно, решил попробовать написать на нем парсер Collada файлов.
Очень сильно проникся идеей инициализации массивов, из-за чего и родился сей говнокод...
Код выдает правильный результат, но абсолютно не читаемый...
пушкофф, ах ты пиздливчик!! думаешь, никто не помнит, как ты усерался, что все свои скрипты на пистоне пишешь? как некрасиво..
и уж не не знаю сколько тысяч готовых xml-парсеров.
и еще не читал, годен ли такой метод для заполнения массивов...
>скорость
хм, как бы помягче сказать...
>дебаг инфы на экран
это ГК или школьник.ру?
"echo -- лучший дебаг" (С) пыхапешники
модель в 2760 полигонов (что мало) преобразовывается в набор вершин и индексов где-то за 3-4 минуты и это без каких-то особых математических преобразований... я в печали, так как файлы покрупнее (в 20 раз крупнее) преобразовываются за считанные секунды нативным экспортером. но хочу попробовать по оптимизировать, может и из питона можно выжать хоть какие-то более вменяемые цифры...
from lxml import etree
и после почитайте про xpath http://ru.wikipedia.org/wiki/XPath
с ним гораздо удобнее работать с xml. красивше:
fifos = etree.XML('''xml text here''')
fifos.xpath('/fifo_report/fifo[@name="operators"]/callers/caller[@status="TALKING"]')
получаю всех callers со атрибутом status = TALKING из fifo с атрибутом name = operators
------
<a href=http://pogoda5day.ru/>погода сейчас</a> | http://pogoda5day.ru/
-----
yacht charter barcelona <a href=http://european-yachts.com/en/rent-yachts-spain>go to site</a>