- 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 файлов.
Очень сильно проникся идеей инициализации массивов, из-за чего и родился сей говнокод...
Код выдает правильный результат, но абсолютно не читаемый...
WGH 13.12.2010 08:37 # 0
pushkoff 13.12.2010 12:42 # 0
xXx_totalwar 13.12.2010 13:32 # +4
пушкофф, ах ты пиздливчик!! думаешь, никто не помнит, как ты усерался, что все свои скрипты на пистоне пишешь? как некрасиво..
pushkoff 13.12.2010 16:56 # −2
xXx_totalwar 13.12.2010 13:37 # +3
и уж не не знаю сколько тысяч готовых xml-парсеров.
pushkoff 13.12.2010 16:59 # 0
и еще не читал, годен ли такой метод для заполнения массивов...
xXx_totalwar 13.12.2010 17:01 # +3
>скорость
хм, как бы помягче сказать...
>дебаг инфы на экран
это ГК или школьник.ру?
pushkoff 13.12.2010 17:04 # 0
Анонимус 13.12.2010 17:10 # +3
"echo -- лучший дебаг" (С) пыхапешники
pushkoff 18.12.2010 05:04 # 0
модель в 2760 полигонов (что мало) преобразовывается в набор вершин и индексов где-то за 3-4 минуты и это без каких-то особых математических преобразований... я в печали, так как файлы покрупнее (в 20 раз крупнее) преобразовываются за считанные секунды нативным экспортером. но хочу попробовать по оптимизировать, может и из питона можно выжать хоть какие-то более вменяемые цифры...
pushkoff 18.12.2010 05:37 # +2
Saehrimnir 26.10.2020 15:58 # 0
pushkoff 13.12.2010 21:37 # 0
fr_butch 13.01.2011 11:06 # +1
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
pushkoff 13.01.2011 13:15 # 0
guest 25.02.2017 18:44 # 0
------
<a href=http://pogoda5day.ru/>погода сейчас</a> | http://pogoda5day.ru/
inkanus-gray 25.02.2017 19:04 # +1
guest 03.03.2017 22:42 # 0
-----
yacht charter barcelona <a href=http://european-yachts.com/en/rent-yachts-spain>go to site</a>
guest 03.03.2017 23:32 # 0
bayan 03.03.2017 23:44 # 0
guest 03.03.2017 23:46 # 0