Russian Qt Forum

Qt => XML => Тема начата: QCasper от Октябрь 08, 2007, 14:07



Название: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 14:07
Кто может мне объяснить почему этот код:
Код:
QDomDocument doc;

doc.appendChild(doc.createElement("body"));
QDomElement root = doc.documentElement();

QDomElement el = doc.createElement("tag");
root.appendChild(el);

for (int i=0; ++i<11;)
el.setAttribute(QString("attr_%1").arg(i), "p");

qDebug(doc.toByteArray(4).constData());

печатает
<body>
    <tag attr_1="p" attr_2="p" attr_3="p" attr_4="p" attr_5="p" attr_6="p" attr_7="p" attr_10="p" attr_8="p" attr_9="p" />
</body>

вместо логичного
<body>
    <tag attr_1="p" attr_2="p" attr_3="p" attr_4="p" attr_5="p" attr_6="p" attr_7="p" attr_8="p" attr_9="p" attr_10="p" />
</body>


Название: Re: QDomDocument - непонятное поведение
Отправлено: Dendy от Октябрь 08, 2007, 15:40
Аттрибуты хранятся в хеше и пишутся последовательно из каждой из веток хеш таблицы. Ключ хеша формируется из названия аттрибута путём суммирования ключей каждого символа. Несложно заметить, что ключ attr_3 будет ровно на единицу больше, чем attr_2. Но! Ключ для attr_10 уже имеет на один символ больше, а значит сумма ключей символов в итоге попадёт в произвольную ветку хеш таблицы, в данном случае - к attr_7. Собственно, данный разброс и демонстрирует эффективность алгоритма быстрого поиска по ключу (скорость в N раз больше по сравнению с прямым перебором, N - размер хеш таблицы). Выборка по аттрибутам рассчитана на поиск по ключу, а не по индексу. Последовательность аттрибутов отсутствует.


Название: Re: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 15:46
то есть нет никакой возможности записать атрибуты в нужном мне порядке?


Название: Re: QDomDocument - непонятное поведение
Отправлено: AlekSi от Октябрь 08, 2007, 19:45
В XML нет такого понятия, как порядок атрибутов.

Код:
for (int i=0; ++i<11;)
Жесть.


Название: Re: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 20:12
В XML нет такого понятия, как порядок атрибутов.

Я все понимаю, я и сам как бы не сторонник. Если бы не одна проблема. Вот попробуйте запихнуть файл проекта visual c++ (*.vcproj) в QDomDocument. А потом, ничего не меняя, сохранить этот QDomDocument назад в этот файл. И все блин, он уже не валидный проект, студия его не открывает. Я посмотрел, при открытии порядок атрибутов поменялся, соответственно то, что я сохранил отличается от того, что было, только порядком атрибутов.

Код:
for (int i=0; ++i<11;)
Жесть.

Чем Вам мне понравилась конструкция? :)


Название: Re: QDomDocument - непонятное поведение
Отправлено: Вячеслав от Октябрь 08, 2007, 20:21
то есть нет никакой возможности записать атрибуты в нужном мне порядке?
В дом не пихал , а развлекался на змейке(python'e) - и порядок менял и добавлял - жрет :( (2005)


Название: Re: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 20:49
то есть нет никакой возможности записать атрибуты в нужном мне порядке?
В дом не пихал , а развлекался на змейке(python'e) - и порядок менял и добавлял - жрет :( (2005)

Со змейкой не знаком, мне бы на c++/qt :) Мне надо то собсно, считать xml'ку и заменить значения атрибутов некоторых тегов своими.


Название: Re: QDomDocument - непонятное поведение
Отправлено: Вячеслав от Октябрь 08, 2007, 21:22
А в qmake поковыряться ? Он-то нормальный проект создает  ;)


Название: Re: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 21:27
А в qmake поковыряться ? Он-то нормальный проект создает  ;)

Эмм... а что именно поковырять?


Название: Re: QDomDocument - непонятное поведение
Отправлено: Вячеслав от Октябрь 08, 2007, 21:31
Если qmake запустить с ключиком -t vc то он создает правильный vcproj ... Соответственно курим генератор который отвечает за это шаблон ;) Ы ?
msvc_vcproj.cpp и msvc_vcproj.h Но ой - они руками xml рисуют :( Облом 


Название: Re: QDomDocument - непонятное поведение
Отправлено: QCasper от Октябрь 08, 2007, 21:49
Если qmake запустить с ключиком -t vc то он создает правильный vcproj ... Соответственно курим генератор который отвечает за это шаблон ;) Ы ?
msvc_vcproj.cpp и msvc_vcproj.h Но ой - они руками xml рисуют :( Облом 

Вот уж точно облом, придется ручной метод оставить