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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qxml не берет корневой елемент  (Прочитано 5282 раз)
virtual_root
Гость
« : Август 29, 2012, 16:30 »

Добрый вечер ребята. Подскажите пожалуйста, что я не так написала в коде. Мне нужно разобрать xml файл, достать значения атрибутов.
Мой код работает, но почему-то я не могу получить тег с именем Modules, а мне нужен его атрибут path.
Вот содержимое моего xml-файла:
Код
XML
<Modules path="./">
<module name="grabber" version="1.0" hash="3hjh2g327fg8y@jeiofhf82ubvbwdjinqdnv3r8y3r9vfivn efpivh13r89vh3r89vh3r80gv7834gv3r"/>
<module name="viewer" version="1.0" hash=" "/>
</Modules>
Вот код моей программы:
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtXml>
 
void traverseNode(const QDomNode& node)
{
  QDomNode domNode = node.firstChild();
  while(!domNode.isNull()) {
      if(domNode.isElement()) {
         QDomElement domElement = domNode.toElement();
         if(!domElement.isNull()) {
             qDebug()<<domElement.tagName();
             if(domElement.tagName() == "module") {
                 qDebug() << "Attr: "
                          << domElement.attribute("name", "")
                          << domElement.attribute("version","")
                          << domElement.attribute("hash","");
             }
             else
             if(domElement.tagName() == "Modules") {
                 qDebug() << "Attr: "
                          << domElement.attribute("path", "!");
 
             }
             else {
                 qDebug() << "TagName: " << domElement.tagName()
                          << "\tText: " << domElement.text();
            }
         }
      }
      traverseNode(domNode);
      domNode = domNode.nextSibling();
   }
}
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QDomDocument domDoc;
       QFile   file("modules.xml");
 
       if(file.open(QIODevice::ReadOnly)) {
           if(domDoc.setContent(&file)) {
               QDomElement domElement= domDoc.documentElement();
               traverseNode(domElement);
           }
           file.close();
       }
 
   return a.exec();
}
 

В выводе приложения получаю:
Код:
Запускается /home/urivskay/QtProjects/Qt+Xml/Qt+Xml...
"module"
Attr:  "grabber" "1.0" "3hjh2g327fg8y@jeiofhf82ubvbwdjinqdnv3r8y3r9vfivn efpivh13r89vh3r89vh3r80gv7834gv3r"
"module"
Attr:  "viewer" "1.0" " "
Программа неожиданно завершилась.
Подскажите пожалуйста как мне поймать самый первый корневой тег Modules ?
Записан
mutineer
Гость
« Ответ #1 : Август 29, 2012, 16:38 »

http://doc.crossplatform.ru/qt/4.7.x/qdomdocument.html#documentElement

Цитировать
QDomElement QDomDocument::documentElement () const
Возвращает корневой элемент текущего документа.
Записан
virtual_root
Гость
« Ответ #2 : Август 29, 2012, 16:49 »

спасибо, я была невнимательна, дописала такую строчку
Код:
qDebug()<<domElement.attribute("path","!");
и всё возвращает)
Записан
virtual_root
Гость
« Ответ #3 : Август 31, 2012, 09:56 »

Подскажите пожалуйста, почему у меня не вносятся изменения в xml файл?
Код
C++ (Qt)
QDomDocument domDoc;
       QFile   file("modules.xml");
 
       if(file.open(QIODevice::ReadOnly)) {
           if(domDoc.setContent(&file)) {
               QDomElement domElement= domDoc.documentElement();
               qDebug()<<domElement.attribute("path","!");
               domElement.setAttribute("path","ttttt");
               traverseNode(domElement);
               //myXmlParser(domElement);
           }
           file.close();
       }
Права на файл на запись есть. В документации смотрела setAttribute("path","ttttt"); написано что если атрибут существует то значение заменится на новое, но ничего не заменяется! Почему?
Записан
virtual_root
Гость
« Ответ #4 : Август 31, 2012, 10:04 »

вопрос снят, я файл открывала только на чтение, извините.
Записан
virtual_root
Гость
« Ответ #5 : Август 31, 2012, 10:08 »

хотя не помогло. Открываю файл на чтение и запись, но атрибуты не заменяются... Что я делаю не так?
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QDomDocument domDoc;
       QFile   file("modules.xml");
 
       if(file.open(QIODevice::ReadWrite)) {
           if(domDoc.setContent(&file)) {
               QDomElement domElement= domDoc.documentElement();
               qDebug()<<domElement.attribute("path","!");
               domElement.setAttribute("path","ttttt");
           }
           file.close();
       }
 
   return a.exec();
}
Записан
mutineer
Гость
« Ответ #6 : Август 31, 2012, 10:11 »

ты меняешь значение в объекте domDoc, но в файл результат не записываешь
Записан
virtual_root
Гость
« Ответ #7 : Август 31, 2012, 10:47 »

спасибо! Пришлось сделать так чтобы сохранять изменения:
Код
C++ (Qt)
if(file.open(QIODevice::ReadWrite)) {
           if(domDoc.setContent(&file)) {
               QDomElement domElement= domDoc.documentElement();
               qDebug()<<domElement.attribute("path","!");
               domElement.setAttribute("path","tania");
               traverseNode(domElement);
               //myXmlParser(domElement);
           }
           file.close();
           if(file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
               file.write(domDoc.toByteArray());
               file.close();
           }
       }
Правда приходится файл открывать дважды...
Записан
mutineer
Гость
« Ответ #8 : Август 31, 2012, 11:00 »

Зачем дважды открывать?
Записан
virtual_root
Гость
« Ответ #9 : Сентябрь 04, 2012, 15:52 »

а как тогда быть?
Записан
mutineer
Гость
« Ответ #10 : Сентябрь 04, 2012, 15:56 »

Открывать один раз, читать, потом записывать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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