Russian Qt Forum
Ноябрь 22, 2024, 21:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDomDocument - непонятное поведение  (Прочитано 7939 раз)
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>
Записан
Dendy
Гость
« Ответ #1 : Октябрь 08, 2007, 15:40 »

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

то есть нет никакой возможности записать атрибуты в нужном мне порядке?
Записан
AlekSi
Гость
« Ответ #3 : Октябрь 08, 2007, 19:45 »

В XML нет такого понятия, как порядок атрибутов.

Код:
for (int i=0; ++i<11;)
Жесть.
Записан
QCasper
Гость
« Ответ #4 : Октябрь 08, 2007, 20:12 »

В XML нет такого понятия, как порядок атрибутов.

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

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

Чем Вам мне понравилась конструкция? Улыбающийся
Записан
Вячеслав
Гость
« Ответ #5 : Октябрь 08, 2007, 20:21 »

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

то есть нет никакой возможности записать атрибуты в нужном мне порядке?
В дом не пихал , а развлекался на змейке(python'e) - и порядок менял и добавлял - жрет Грустный (2005)

Со змейкой не знаком, мне бы на c++/qt Улыбающийся Мне надо то собсно, считать xml'ку и заменить значения атрибутов некоторых тегов своими.
Записан
Вячеслав
Гость
« Ответ #7 : Октябрь 08, 2007, 21:22 »

А в qmake поковыряться ? Он-то нормальный проект создает  Подмигивающий
Записан
QCasper
Гость
« Ответ #8 : Октябрь 08, 2007, 21:27 »

А в qmake поковыряться ? Он-то нормальный проект создает  Подмигивающий

Эмм... а что именно поковырять?
Записан
Вячеслав
Гость
« Ответ #9 : Октябрь 08, 2007, 21:31 »

Если qmake запустить с ключиком -t vc то он создает правильный vcproj ... Соответственно курим генератор который отвечает за это шаблон Подмигивающий Ы ?
msvc_vcproj.cpp и msvc_vcproj.h Но ой - они руками xml рисуют Грустный Облом 
« Последнее редактирование: Октябрь 08, 2007, 21:34 от Вячеслав » Записан
QCasper
Гость
« Ответ #10 : Октябрь 08, 2007, 21:49 »

Если qmake запустить с ключиком -t vc то он создает правильный vcproj ... Соответственно курим генератор который отвечает за это шаблон Подмигивающий Ы ?
msvc_vcproj.cpp и msvc_vcproj.h Но ой - они руками xml рисуют Грустный Облом 

Вот уж точно облом, придется ручной метод оставить
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 21.