QDebug operator <<(QDebug out, const QXmlStreamAttribute &a) { out << "QXmlStreamAttribute(" << "prefix:" << a.prefix().toString() << "namespaceuri:" << a.namespaceUri().toString() << "name:" << a.name().toString() << " value:" << a.value().toString() << ")"; return out; }
_class * readFromXML(QString fileXml) { _class *root = NULL; // init xml stream QFile file(fileXml); QXmlStreamReader xmlReader; //QString line; if ( !file.open(QIODevice::ReadOnly) ) return false; { QTextStream t( &file ); // stream.setCodec("CP-866"); xmlReader.addData(t.readAll()); } // start reading QStack<_specXMLElement *> stackElements; while(!xmlReader.atEnd()) { if(xmlReader.isCharacters() && stackElements.count() != 0) { _specXMLElement *pElemTop = stackElements.top(); if(pElemTop->hasBody()) pElemTop->setBody(xmlReader.readElementText()); } if(xmlReader.isStartElement()) { QString strName = xmlReader.name().toString(); _specXMLElement *elem = createElement(strName); _specXMLElement *parentElem = (stackElements.count() != 0) ? stackElements.top() : NULL; if(stackElements.count() == 0) root = (_class *)elem; if(parentElem != NULL) parentElem->addChildElement(strName,elem); stackElements.push(elem); for(int i = 0; i < xmlReader.attributes().count(); i++) { QXmlStreamAttribute attr = xmlReader.attributes().at(i); elem->setAttribute(attr.name().toString(), attr.value().toString()); } } if(xmlReader.isEndElement()) { stackElements.pop(); } xmlReader.readNext(); }; if(xmlReader.hasError()) { return NULL; // std::cout << xmlReader.errorString().toStdString(); } return root; };
QDebug operator<<(QDebug dbg, const QXmlStreamAttribute &a) { dbg.nospace() << a.namespaceUri().toString() << ":" << a.name().toString() << " = " << a.value().toString(); return dbg.space(); }/**/