Название: чтение xml-файла
Отправлено: demaker от Май 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 в консоль не выводятся. Подскажите в чем может быть проблема?
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 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(); } }
Как то так...
Название: Re: чтение xml-файла
Отправлено: demaker от Май 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>
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 20, 2014, 12:07
Ненене... ну видно же, не тот файл вы грузите :o
Название: Re: чтение xml-файла
Отправлено: demaker от Май 20, 2014, 12:12
а как надо, подскажите пожалуйста :)
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 20, 2014, 12:19
а как надо, подскажите пожалуйста :)
Дык, подсказал уже - вы грузите не тот xml-файл что указали. Выведите в консоль полное имя файла, просмотрите его содержимое в текстовом редакторе...
Название: Re: чтение xml-файла
Отправлено: demaker от Май 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"
и что???
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 20, 2014, 13:12
А что в файле?
Название: Re: чтение xml-файла
Отправлено: demaker от Май 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>
Название: Re: чтение xml-файла
Отправлено: demaker от Май 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: ""
и ни разу не вывел атрибут?!
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 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"; } }
Название: Re: чтение xml-файла
Отправлено: demaker от Май 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"
и опять ни одного атрибута :-\
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 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"
Название: Re: чтение xml-файла
Отправлено: demaker от Май 20, 2014, 14:56
А почему у меня не работает тогда ???
А в каком редакторе вы создали xml-файл?
Название: Re: чтение xml-файла
Отправлено: kai666_73 от Май 20, 2014, 15:31
Notepad++ Кодировка UTF-8 (без BOM)
PS. Для полноты картины: Qt-4.8.1, VS2008, Win7 X64
Название: Re: чтение xml-файла
Отправлено: demaker от Май 20, 2014, 20:31
Всем спасибо большое за подсказки, разобрался. Проблема была в том, что xml файл неправильно создавался.
|