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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: чтение xml-файла  (Прочитано 11829 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Май 19, 2014, 13:29 »

Пытаюсь прочитать xml-файл

Код
C++ (Qt)
MyXMLObject::MyXMLObject(QString xmlName,QObject *parent):
   QObject(parent)
{
   QDomDocument domDoc;
   QFile        file(xmlName);
 
   if(file.open(QIODevice::ReadOnly))
   {
       qDebug()<<"File open";
       if(domDoc.setContent(&file))
       {
           QDomElement domElement= domDoc.documentElement();
           traverseNode(domElement);
       }
       file.close();
   }
   else
   {
       qDebug()<<"File no open";
   }
}
 
MyXMLObject::~MyXMLObject()
{
 
}
 
void MyXMLObject::traverseNode(const QDomNode& node)
{
  QDomNode domNode = node.firstChild();
  while(!domNode.isNull())
  {
      if(domNode.isElement())
      {
         QDomElement domElement = domNode.toElement();
         if(!domElement.isNull())
         {
             if(domElement.tagName() == "contact")
             {
                 qDebug() << "Attr: "
                          << domElement.attribute("number", "");
             }
             else
             {
                 qDebug() << "TagName: " << domElement.tagName()
                          << "\tText: " << domElement.text();
             }          
         }
      }
      traverseNode(domNode);
      domNode = domNode.nextSibling();
   }
}
 

xml-code
Код:
<?xml  version="1.0" encoding="Windows-1251"?>
<doc name="Demaker">
<contact number="1234567890"/>
</doc>

Сам файл открывается и читается,
но к сожалению, атрибуты connact -> number в консоль не выводятся.

Подскажите в чем может быть проблема?
« Последнее редактирование: Май 19, 2014, 13:31 от demaker » Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Май 19, 2014, 17:21 »

Код:
void MyXMLObject::traverseNode(const QDomElement& node)
{
   QDomElement domElement = node.firstChildElement();
   while(!domElement.isNull())
   {
              if(domElement.tagName() == "contact")
              {
                  qDebug() << "Attr: "
                           << domElement.attribute("number", "");
              }
              else
              {
                  qDebug() << "TagName: " << domElement.tagName()
                           << "\tText: " << domElement.text();
              }          
       traverseNode(domElement);
       domElement = domElement.nextSiblingElement();
    }
}

Как то так...
« Последнее редактирование: Май 19, 2014, 17:31 от kai666_73 » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #2 : Май 20, 2014, 10:18 »

не-а

а сам xml-код правильный???
написал вот такой код:

Код
C++ (Qt)
MyXMLObject::MyXMLObject(QString xmlName,QObject *parent):
   QObject(parent)
{
   QDomDocument domDoc;
   QFile        file(xmlName);
 
   if(file.open(QIODevice::ReadOnly))
   {
       qDebug()<<"File open";
       if(domDoc.setContent(&file))
       {
           QDomElement domElement= domDoc.documentElement();
           QDomNode node = domElement.firstChild();
           while (!node.isNull())
           {
               if(node.isElement())
               {
                   QDomElement element = node.toElement();
                   qDebug()<<tr("Element:")<<element.tagName();
                   qDebug()<<tr("Attribut:")<<element.attribute("name","--");
               }
 
               if(node.isText())
                   {
                       QDomText text = node.toText();
                              qDebug()<<text.data();
                   }
                                node = node.nextSibling();
           }
 
           //traverseNode(domElement);
       }
       file.close();
   }
   else
   {
       qDebug()<<"File no open";
   }
}
 

в консоль выводит
Код:
File open 
"Element:" "o:DocumentProperties"
"Attribut:" "--"
"Element:" "w:fonts"
"Attribut:" "--"
"Element:" "w:styles"
"Attribut:" "--"
"Element:" "w:docPr"
"Attribut:" "--"
"Element:" "w:body"
"Attribut:" "--"

а сам xml-файл
Код:
<?xml  version="1.0" encoding="windows-1251"?>
<doc name="Evgen">
<contact number="12345676890"/>
</doc>
« Последнее редактирование: Май 20, 2014, 10:52 от demaker » Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #3 : Май 20, 2014, 12:07 »

Ненене... ну видно же, не тот файл вы грузите Шокированный
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #4 : Май 20, 2014, 12:12 »

а как надо, подскажите пожалуйста Улыбающийся
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #5 : Май 20, 2014, 12:19 »

а как надо, подскажите пожалуйста Улыбающийся
Дык, подсказал уже - вы грузите не тот xml-файл что указали.
Выведите в консоль полное имя файла, просмотрите его содержимое в текстовом редакторе...
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Май 20, 2014, 12:31 »

Ну вот вывел полное имя файла
Код
C++ (Qt)
...
QDomDocument domDoc;
QFile        file(xmlName);
 
qDebug()<<file.fileName(); //имя файла!!!
 
 

Код:
"D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/addressbook.xml" 

и что???
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #7 : Май 20, 2014, 13:12 »

А что в файле?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #8 : Май 20, 2014, 13:23 »

содержимое файла:
Код:
<?xml  version="1.0"?>
<!--MY Address Book-->
<addressbook>
<contact number = "1">
<name>Piggy</name>
<phone>+49 612345663</phone>
<email>piggy@mega.de</email>
</contact>
</addressbook>
« Последнее редактирование: Май 20, 2014, 13:27 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #9 : Май 20, 2014, 13:26 »

Cделал как у Шлее
Код
C++ (Qt)
MyXMLObject::MyXMLObject(QString xmlName,QObject *parent):
   QObject(parent)
{
   QDomDocument domDoc;
   QFile        file(xmlName);
   qDebug()<<file.fileName();
 
   if(file.open(QIODevice::ReadOnly))
   {
       qDebug()<<"File open";
       if(domDoc.setContent(&file))
       {
           QDomElement domElement = domDoc.documentElement();
           traverseNode(domElement);
       }
       file.close();
   }
   else
   {
       qDebug()<<"File no open";
   }
}
 
MyXMLObject::~MyXMLObject()
{
 
}
 
void MyXMLObject::traverseNode(const QDomNode& node)
{
  QDomNode domNode = node.firstChild();
  while(!domNode.isNull())
  {
      if(domNode.isElement())
      {
         QDomElement domElement = domNode.toElement();
         if(!domElement.isNull())
         {
             if(domElement.tagName() == "contact")
             {
                 qDebug() << "Attr: "
                          << domElement.attribute("number", "");
             }
             else
             {
                 qDebug() << "TagName: " << domElement.tagName()
                          << "\tText: " << domElement.text();
             }
         }
      }
      traverseNode(domNode);
      domNode = domNode.nextSibling();
   }
}
 

Выводит
Код:
"D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/addressbook.xml" 
File open
TagName:  "o:DocumentProperties" Text:  "<EVGENIEVGENI212014-05-20T10:26:00Z2014-05-20T10:26:00Z128163SNIIP1119011.5604"
TagName:  "o:Title" Text:  "<"
TagName:  "o:Author" Text:  "EVGENI"
TagName:  "o:LastAuthor" Text:  "EVGENI"
TagName:  "o:Revision" Text:  "2"
TagName:  "o:TotalTime" Text:  "1"
TagName:  "o:Created" Text:  "2014-05-20T10:26:00Z"
TagName:  "o:LastSaved" Text:  "2014-05-20T10:26:00Z"
TagName:  "o:Pages" Text:  "1"
TagName:  "o:Words" Text:  "28"
TagName:  "o:Characters" Text:  "163"
TagName:  "o:Company" Text:  "SNIIP"
TagName:  "o:Lines" Text:  "1"
TagName:  "o:Paragraphs" Text:  "1"
TagName:  "o:CharactersWithSpaces" Text:  "190"
TagName:  "o:Version" Text:  "11.5604"
TagName:  "w:fonts" Text:  ""
TagName:  "w:defaultFonts" Text:  ""
TagName:  "w:styles" Text:  ""
TagName:  "w:versionOfBuiltInStylenames" Text:  ""
TagName:  "w:latentStyles" Text:  ""
TagName:  "w:style" Text:  ""
TagName:  "w:name" Text:  ""
TagName:  "wx:uiName" Text:  ""
TagName:  "w:rPr" Text:  ""
TagName:  "wx:font" Text:  ""
TagName:  "w:sz" Text:  ""
TagName:  "w:sz-cs" Text:  ""
TagName:  "w:lang" Text:  ""
TagName:  "w:style" Text:  ""
TagName:  "w:name" Text:  ""
TagName:  "wx:uiName" Text:  ""
TagName:  "w:semiHidden" Text:  ""
TagName:  "w:style" Text:  ""
TagName:  "w:name" Text:  ""
TagName:  "wx:uiName" Text:  ""
TagName:  "w:semiHidden" Text:  ""
TagName:  "w:rPr" Text:  ""
TagName:  "wx:font" Text:  ""
TagName:  "w:tblPr" Text:  ""
TagName:  "w:tblInd" Text:  ""
TagName:  "w:tblCellMar" Text:  ""
TagName:  "w:top" Text:  ""
TagName:  "w:left" Text:  ""
TagName:  "w:bottom" Text:  ""
TagName:  "w:right" Text:  ""
TagName:  "w:style" Text:  ""
TagName:  "w:name" Text:  ""
TagName:  "wx:uiName" Text:  ""
TagName:  "w:semiHidden" Text:  ""
TagName:  "w:docPr" Text:  ""
TagName:  "w:view" Text:  ""
TagName:  "w:zoom" Text:  ""
TagName:  "w:attachedTemplate" Text:  ""
TagName:  "w:defaultTabStop" Text:  ""
TagName:  "w:punctuationKerning" Text:  ""
TagName:  "w:characterSpacingControl" Text:  ""
TagName:  "w:optimizeForBrowser" Text:  ""
TagName:  "w:validateAgainstSchema" Text:  ""
TagName:  "w:saveInvalidXML" Text:  ""
TagName:  "w:ignoreMixedContent" Text:  ""
TagName:  "w:alwaysShowPlaceholderText" Text:  ""
TagName:  "w:compat" Text:  ""
TagName:  "w:breakWrappedTables" Text:  ""
TagName:  "w:snapToGridInCell" Text:  ""
TagName:  "w:wrapTextWithPunct" Text:  ""
TagName:  "w:useAsianBreakRules" Text:  ""
TagName:  "w:dontGrowAutofit" Text:  ""
TagName:  "w:body" Text:  "<?xml  version="1.0"?><!--MY Address Book--><addressbook><contact number = "1"><name>Piggy</name><phone>+49 612345663</phone><email>piggy@mega.de</email></contact></addressbook>"
TagName:  "wx:sect" Text:  "<?xml  version="1.0"?><!--MY Address Book--><addressbook><contact number = "1"><name>Piggy</name><phone>+49 612345663</phone><email>piggy@mega.de</email></contact></addressbook>"
TagName:  "w:p" Text:  "<?xml  version="1.0"?>"
TagName:  "w:r" Text:  "<?xml  version="1.0"?>"
TagName:  "w:t" Text:  "<?xml  version="1.0"?>"
TagName:  "w:p" Text:  "<!--MY Address Book-->"
TagName:  "w:r" Text:  "<!--MY Address Book-->"
TagName:  "w:t" Text:  "<!--MY Address Book-->"
TagName:  "w:p" Text:  "<addressbook>"
TagName:  "w:r" Text:  "<addressbook>"
TagName:  "w:t" Text:  "<addressbook>"
TagName:  "w:p" Text:  "<contact number = "1">"
TagName:  "w:r" Text:  "<contact number = "1">"
TagName:  "w:t" Text:  "<contact number = "1">"
TagName:  "w:p" Text:  "<name>Piggy</name>"
TagName:  "w:r" Text:  "<name>Piggy</name>"
TagName:  "w:tab" Text:  ""
TagName:  "w:t" Text:  "<name>Piggy</name>"
TagName:  "w:p" Text:  "<phone>+49 612345663</phone>"
TagName:  "w:r" Text:  "<phone>+49 612345663</phone>"
TagName:  "w:tab" Text:  ""
TagName:  "w:t" Text:  "<phone>+49 612345663</phone>"
TagName:  "w:p" Text:  "<email>piggy@mega.de</email>"
TagName:  "w:r" Text:  "<email>piggy@mega.de</email>"
TagName:  "w:tab" Text:  ""
TagName:  "w:t" Text:  "<email>piggy@mega.de</email>"
TagName:  "w:r" Text:  ""
TagName:  "w:tab" Text:  ""
TagName:  "w:r" Text:  ""
TagName:  "w:tab" Text:  ""
TagName:  "w:p" Text:  "</contact>"
TagName:  "w:r" Text:  "</contact>"
TagName:  "w:t" Text:  "</contact>"
TagName:  "w:p" Text:  "</addressbook>"
TagName:  "w:r" Text:  "</addressbook>"
TagName:  "w:t" Text:  "</addressbook>"
TagName:  "w:sectPr" Text:  ""
TagName:  "w:pgSz" Text:  ""
TagName:  "w:pgMar" Text:  ""
TagName:  "w:cols" Text:  ""
TagName:  "w:docGrid" Text:  ""

и ни разу не вывел атрибут?!
« Последнее редактирование: Май 20, 2014, 13:31 от demaker » Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #10 : Май 20, 2014, 13:59 »

Оо, кажется, понял.
Проблема в некорректном вызове ф-ии traverseNode(domElement).
Попробуйте так
Код:
MyXMLObject::MyXMLObject(QString xmlName,QObject *parent):
    QObject(parent)
{
    QDomDocument domDoc;
    QFile        file(xmlName);
    qDebug()<<file.fileName();
 
    if(file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"File open";
        if(domDoc.setContent(&file))
        {
            QDomElement domElement = domDoc.documentElement();
            traverseNode(domElement.firstChild());                               // <<<<<<<<<<<<<<<<<<<<<
        }
        file.close();
    }
    else
    {
        qDebug()<<"File no open";
    }
}
« Последнее редактирование: Май 20, 2014, 14:01 от kai666_73 » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #11 : Май 20, 2014, 14:06 »

Выдал
Код:
"D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/addressbook.xml" 
File open
TagName:  "o:Title" Text:  "<"
TagName:  "o:Author" Text:  "EVGENI"
TagName:  "o:LastAuthor" Text:  "EVGENI"
TagName:  "o:Revision" Text:  "2"
TagName:  "o:TotalTime" Text:  "1"
TagName:  "o:Created" Text:  "2014-05-20T10:26:00Z"
TagName:  "o:LastSaved" Text:  "2014-05-20T10:26:00Z"
TagName:  "o:Pages" Text:  "1"
TagName:  "o:Words" Text:  "28"
TagName:  "o:Characters" Text:  "163"
TagName:  "o:Company" Text:  "SNIIP"
TagName:  "o:Lines" Text:  "1"
TagName:  "o:Paragraphs" Text:  "1"
TagName:  "o:CharactersWithSpaces" Text:  "190"
TagName:  "o:Version" Text:  "11.5604"

и опять ни одного атрибута В замешательстве
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #12 : Май 20, 2014, 14:28 »

Попробовал у себя:

d:/addr.xml
Код:
<?xml  version="1.0"?>
<!--MY Address Book-->
<addressbook>
<contact number = "1">
<name>Piggy</name>
<phone>+49 612345663</phone>
<email>piggy@mega.de</email>
</contact>
</addressbook>

Ваш же вариант:
Код:
class MyXMLObject : public QObject
{
public:
    MyXMLObject(QString xmlName,QObject *parent = 0)
        : QObject(parent)
    {
        QDomDocument domDoc;
        QFile        file(xmlName);
        qDebug()<<file.fileName();

        if(file.open(QIODevice::ReadOnly))
        {
            qDebug()<<"File open";
            if(domDoc.setContent(&file))
            {
                QDomElement domElement = domDoc.documentElement();
                traverseNode(domElement);
            }
            file.close();
        }
        else
        {
            qDebug()<<"File no open";
        }
    }

    ~MyXMLObject()
    { }

    void traverseNode(const QDomNode& node)
    {
       QDomNode domNode = node.firstChild();
       while(!domNode.isNull())
       {
           if(domNode.isElement())
           {
              QDomElement domElement = domNode.toElement();
              if(!domElement.isNull())
              {
                  if(domElement.tagName() == "contact")
                  {
                      qDebug() << "Attr: "
                               << domElement.attribute("number", "");
                  }
                  else
                  {
                      qDebug() << "TagName: " << domElement.tagName()
                               << "\tText: " << domElement.text();
                  }
              }
           }
           traverseNode(domNode);
           domNode = domNode.nextSibling();
        }
    }
};

...
MyXMLObject xxx("d:/addr.xml");

В консоли то что и ожидалось
Код:
"d:/addr.xml" 
File open
Attr:  "1"
TagName:  "name" Text:  "Piggy"
TagName:  "phone" Text:  "+49 612345663"
TagName:  "email" Text:  "piggy@mega.de"
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #13 : Май 20, 2014, 14:56 »

А почему у меня не работает тогда Непонимающий

А в каком редакторе вы создали xml-файл?
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #14 : Май 20, 2014, 15:31 »

Notepad++
Кодировка UTF-8 (без BOM)

PS. Для полноты картины: Qt-4.8.1, VS2008, Win7 X64
« Последнее редактирование: Май 20, 2014, 15:35 от kai666_73 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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