Название: чтение XML Отправлено: ¤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? Название: Re: чтение XML Отправлено: sLiva от Май 14, 2009, 21:22 Мне кажется, что структура xml построена неверно.
Имхо должно быть, что-то в этом роде: Код: <config> И тогда в цикле по всем комбобоксам проходится а в подцикле по их значениям Название: Re: чтение XML Отправлено: ¤Se®ega¤ от Май 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 с уникальным идентификатором.Если не трудно,подскажите как это можно изменить... Название: Re: чтение XML Отправлено: sLiva от Май 15, 2009, 15:06 на мой взгляд combobox/combobox_2 не сильно отличается от combobox value number="0"/combobox value number="1" по сути На самом деле сильно отличается. Я бы делал примерно так: xml: Код: <config> Создание xml (остального кода не знаю поэтому пишу псевдокодом, надеюсь понятно): Код: QDomDocument doc("Configuration"); Чтение xml: Код: QDomNode domNode = node.firstChild(); А вообще по большому счету если порядок не важен, при такой схеме можно совсем без номеров обойтись Если не понятно, выложи остальной код, и опиши задачу... Название: Re: чтение XML Отправлено: ¤Se®ega¤ от Май 16, 2009, 09:09 Спасибо, все понятно.В ближайшее время буде реализовывать.Если возникнут вопросы-обязательно задам.Еще раз спасибо.
|