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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: чтение XML  (Прочитано 5328 раз)
¤Se®ega¤
Гость
« : Май 14, 2009, 20:59 »

есть xml файл примерно следующего содержания:

<config>
 <main_form>
  <autoriz_form>
   <title>Авторизация</title>
   <label>Пароль:</label>
   <combobox>
    <value_0>Диспетчер</value_0>
    <value_1>Администратор</value_1>
   </combobox>
  </autoriz_form>
 </main_form>
</config>


считывание устроено следующим образом:

QDomNode domNode = node.firstChild();
while(!domNode.isNull()) {
if(domNode.isElement()) {
QDomElement domElement = domNode.toElement();
if(!domElement.isNull()) {

    if(domElement.tagName() == "autoriz_form")
    domNode = domNode.nextSibling();
        if(domElement.tagName() == "title")
        interf->setWindowTitle(domElement.text().toUtf8());

        if(domElement.tagName() == "label")
        interf->ui_autoriz.label_9->setText(domElement.text().toUtf8());

        if(domElement.tagName() == "combobox")
        domNode = domNode.nextSibling();

        if(domElement.tagName() == "value_0")
        interf->ui_autoriz.comboBox->setItemText(0,domElement.text().toUtf8());

        if(domElement.tagName() == "value_1")
        interf->ui_autoriz.comboBox->setItemText(1,domElement.text().toUtf8());
    }
}
traverseNode(domNode) ;
domNode = domNode.nextSibling();
}

Казалось бы все работает.чего еще хотеть?Но стоит xml файл изменить следующим образом:
<config>
 <main_form>
  <autoriz_form>
   <title>Авторизация</title>
   <label>Пароль:</label>
   <combobox>
    <value_0>Диспетчер</value_0>
    <value_1>Администратор</value_1>
   </combobox>
   <combobox_2>
    <value_0>hello</value_0>
    <value_1>hi</value_1>
   </combobox_2>

  </autoriz_form>
 </main_form>
</config>

И считывание тегов становится проблематичным. Подскадите как мне отлавливать значения предыдущих тегов? т.е. чтобы value_0 и value_1 считывать отдельно для combobox и combobox_2?
Записан
sLiva
Гость
« Ответ #1 : Май 14, 2009, 21:22 »

Мне кажется, что структура xml построена неверно.

Имхо должно быть, что-то в этом роде:

Код:
<config>
 <main_form>
  <autoriz_form>
   <title>Авторизация</title>
   <label>Пароль:</label>
   <combobox number="0">
    <value number="0">Диспетчер</value>
    <value number="1">Администратор</value>
   </combobox>
   <combobox number="1">
    <value number="0">hello</value>
    <value number="1">hi</value>
   </combobox>
  </autoriz_form>
 </main_form>
</config>

И тогда в цикле по всем комбобоксам проходится а в подцикле по их значениям

Записан
¤Se®ega¤
Гость
« Ответ #2 : Май 14, 2009, 22:53 »

на мой взгляд combobox/combobox_2 не сильно отличается от combobox value number="0"/combobox value number="1" по сути (можно и combobox[number] я думаю). Подскажите как именно организовать цикл (чтобы как только наткнулся на комбобокс, спскаться дальше по дереву). Да и количество value не всегда равно 2, естественно.Можно конечно для КАЖДОГО значения писать свой тег, но это думаю не совсем правильно.
И еще вопрос касательно записи.Устроена она следующим образом:
QDomDocument doc("Configuration");
QDomElement conf = doc.createElement("config");
doc.appendChild(conf);

QDomElement main_form = doc.createElement("main_form");
conf.appendChild(main_form);

QDomElement autoriz = doc.createElement("autoriz_form");
main_form.appendChild(autoriz);

QDomElement title = doc.createElement("title");
QDomText text  = doc.createTextNode(interf->windowTitle());
autoriz.appendChild(title);
title.appendChild(text);

QDomElement label = doc.createElement("label");
QDomText text_1 = doc.createTextNode(interf->ui_autoriz.label_9->text());
autoriz.appendChild(label);
label.appendChild(text_1);

QDomElement combobox = doc.createElement("combobox");
autoriz.appendChild(combobox);


QDomElement combobox_v1 = doc.createElement("value_0");
QDomText text_2 = doc.createTextNode(interf->ui_autoriz.comboBox->itemText(0));
combobox.appendChild(combobox_v1);
combobox_v1.appendChild(text_2);

QDomElement combobox_v2 = doc.createElement("value_1");
QDomText text_3 = doc.createTextNode(interf->ui_autoriz.comboBox->itemText(1));
combobox.appendChild(combobox_v2);
combobox_v2.appendChild(text_3);

QDomElement combobox_2 = doc.createElement("combobox_2");
autoriz.appendChild(combobox_2);

QDomElement combobox_v3 = doc.createElement("value_0");
QDomText text_4 = doc.createTextNode(interf->ui_autoriz.comboBox_2->itemText(0));
combobox_2.appendChild(combobox_v3);
combobox_v3.appendChild(text_4);

QDomElement combobox_v4 = doc.createElement("value_1");
QDomText text_5 = doc.createTextNode(interf->ui_autoriz.comboBox_2->itemText(1));
combobox_2.appendChild(combobox_v4);
combobox_v4.appendChild(text_5);


Не совсем радует тот факт, что для каждого строкового параметра необходимо заводить QDomText с уникальным идентификатором.Если не трудно,подскажите как это можно изменить...
 
« Последнее редактирование: Май 14, 2009, 22:59 от ¤Se®ega¤ » Записан
sLiva
Гость
« Ответ #3 : Май 15, 2009, 15:06 »

на мой взгляд combobox/combobox_2 не сильно отличается от combobox value number="0"/combobox value number="1" по сути

На самом деле сильно отличается.

Я бы делал примерно так:

xml:
Код:
<config>
 <main_form>
  <autoriz_form>
   <title>Авторизация</title>
   <label>Пароль:</label>
   <combobox number="0">
    <value number="0">Диспетчер</value>
    <value number="1">Администратор</value>
   </combobox>
   <combobox number="1">
    <value number="0">hello</value>
    <value number="1">hi</value>
   </combobox>
  </autoriz_form>
 </main_form>
</config>


Создание xml (остального кода не знаю поэтому пишу псевдокодом, надеюсь понятно):
Код:
QDomDocument doc("Configuration");
QDomElement conf = doc.createElement("config");
doc.appendChild(conf);

QDomElement main_form = doc.createElement("main_form");
conf.appendChild(main_form);

QDomElement autoriz = doc.createElement("autoriz_form");
main_form.appendChild(autoriz);

QDomElement title = doc.createElement("title");
autoriz.appendChild(title);
title.appendChild(doc.createTextNode(interf->windowTitle())); // Обрати внимание чтобы не создавать QDomText

QDomElement label = doc.createElement("label");
autoriz.appendChild(label);
label.appendChild(doc.createTextNode(interf->ui_autoriz.label_9->text()));

цикл_по_виджетам_комбобокса {
    QDomElement combobox = doc.createElement("combobox");
    combobox.setAttribute("number", [номер комбобокса] );
    autoriz.appendChild(combobox);
         
    цикл_по_элементам_комбобокса {
        QDomElement combobox_value = doc.createElement("value");
        combobox_value.setAttribute("number", [номер_элемента_комбобокса] );
        combobox.appendChild(combobox_value);
        combobox_value.appendChild(doc.createTextNode( [текущий_в_цикле_комбобокс]->itemText( [номер_элемента_комбобокса] ) ));
    }
}

Чтение xml:

Код:
QDomNode domNode = node.firstChild();
while(!domNode.isNull()) {
    if(domNode.isElement()) {
        QDomElement domElement = domNode.toElement();
        if(!domElement.isNull()) {
       
            if(domElement.tagName() == "autoriz_form")
                domNode = domNode.nextSibling();
           
            if(domElement.tagName() == "title")
                interf->setWindowTitle(domElement.text().toUtf8());
       
            if(domElement.tagName() == "label")
                interf->ui_autoriz.label_9->setText(domElement.text().toUtf8());
       
            if(domElement.tagName() == "combobox") {
                // делаем что нада с комбобоксом
                QDomElement vauleDomElement = domElement.firstChildElement("value");
                // Проход по все значениям комбобокса
                for (; !vauleDomElement.isNull(); vauleDomElement = vauleDomElement.nextSiblingElement("value")) {
                    // делаем что нада с с элементом комбобокса
                }
                // номера можно достать вызовом domElement.atribute("number")
            }
        }
    }
    traverseNode(domNode);
    domNode = domNode.nextSibling();
}

А вообще по большому счету если порядок не важен, при такой схеме можно совсем без номеров обойтись

Если не понятно, выложи остальной код, и опиши задачу...
Записан
¤Se®ega¤
Гость
« Ответ #4 : Май 16, 2009, 09:09 »

Спасибо, все понятно.В ближайшее время буде реализовывать.Если возникнут вопросы-обязательно задам.Еще раз спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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