SIM_XMLSTREAMREADER_H_ #ifndef #define SIM_XMLSTREAMREADER_H_ #include <QString> #include <QXmlStreamReader> class XMLStreamReader { public : XMLStreamReader (); ~ XMLStreamReader (); // read the file BOOL the ReadFile ( const QString & fileName); // skip does not recognize elements void SkipUnknownElement (); // read the main part of the XML file void ReadWantDecideEditElement (); // parse scenario basic information void ReadScenarioElement (); // parse scenario file entity information void ReadEntitiesElement (); // parse scenario file model publish-subscribe relationship void ReadModelsElement (); // parse all the parameters of the entity void ReadParametersElement (); // parse publish relational void ReadPublishElement (); // parse subscription relationship void ReadSubscribeElement () ; Private : QXmlStreamReader m_qxml_reader; }; #endif // SIM_XMLSTREAMREADER_H_
#include "xml_stream_reader.h" #include <QFile> #include <QDebug> #include <iostream> using namespace std; XmlStreamReader::XmlStreamReader() { } XmlStreamReader::~XmlStreamReader() { } bool XmlStreamReader::ReadFile(const QString &fileName) { QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { std::cerr << "Error: Cannot read file "QPrintable << (fileName) << " : " << qPrintable (file.errorString ()) << std :: endl; return false ; } // If the file is opened successfully, set it to QXmlStreamReader input device m_qxml_reader.setDevice (& file); // readNext () function reads the next token from the input stream, if successful, but also the end of the XML file did not arrive, the function will enter the while loop // each call readNext () function, the next mark will be read and becomes the current token, readNext () function reports the error, atEnd return to true m_qxml_reader.readNext (); // when reading to the end of the XML document, or an error occurs, atEnd () function returns to true the while (! m_qxml_reader.atEnd ()) { // If the current mark is StartElement, returns to true IF (m_qxml_reader.isStartElement ()) { IF (m_qxml_reader.name() == "WantDecideEdit") { ReadWantDecideEditElement(); } else { m_qxml_reader.raiseError(QObject::tr("Not a WantDecideEdit file")); } } else { m_qxml_reader.readNext(); } } file.close(); if (m_qxml_reader.hasError()) { std::cerr << "Error: Failed to parse file "<< qPrintable(fileName) << ": "<< qPrintable(m_qxml_reader.errorString()) << std::endl; return false; } else if (file.error() != QFile::NoError) { std::cerr << "Error: Cannot read file " << qPrintable(fileName)<< ": " << qPrintable(file.errorString())<< std::endl; return false; } return true; } void XmlStreamReader::ReadWantDecideEditElement() { // skip the current mark, the mark can only be WantDecideEdit m_qxml_reader.readNext (); the while (! M_qxml_reader.atEnd ()) { // If the read-off label, only </ WantDecideEdit> notation, skip this tag out of the loop and the IF (m_qxml_reader.isEndElement ()) { IF (m_qxml_reader.name () == " WantDecideEdit " ) { m_qxml_reader.readNext (); BREAK ; } the else m_qxml_reader.readNext (); } IF (m_qxml_reader.isStartElement () ) { IF (m_qxml_reader.name () == "ScenarioInfo") { ReadScenarioElement(); } else if (m_qxml_reader.name() == "Entities") { ReadEntitiesElement(); } else if (m_qxml_reader.name() == "Models") { ReadModelsElement(); } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadScenarioElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "ScenarioInfo") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Name") { QString name = m_qxml_reader.readElementText(); qDebug() << "name:" << name << endl; } else if (m_qxml_reader.name() == "ModificationDate") { QString modification_date = m_qxml_reader.readElementText(); qDebug() << "modification_date:" << modification_date << endl; } else if (m_qxml_reader.name() == "Description") { QString description = m_qxml_reader.readElementText(); qDebug() << "description:" << description << endl; return; } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadParametersElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "Parameters") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Parameter") { QString name = m_qxml_reader.attributes().value("name").toString(); QString type = m_qxml_reader.attributes().value("type").toString(); QString display_name = m_qxml_reader.attributes().value("displayName").toString(); QString usage = m_qxml_reader.attributes().value("usage").toString(); QString value = m_qxml_reader.attributes().value("value").toString(); qDebug() " m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadPublishElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "Publish") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Topic") { QString topic_name = m_qxml_reader.attributes().value("topicName").toString(); QString topic_param_name = m_qxml_reader.attributes().value("topicParamName").toString(); QString model_param_name = m_qxml_reader.attributes().value("modelParamName").toString(); qDebug() << "topicName:" << topic_name << ",topicParamName:" << topic_param_name << ",modelParamName:" << model_param_name << endl; m_qxml_reader.readNext(); } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadSubscribeElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "Subscribe") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Topic") { QString topic_name = m_qxml_reader.attributes().value("topicName").toString(); QString topic_param_name = m_qxml_reader.attributes().value("topicParamName").toString(); QString model_param_name = m_qxml_reader.attributes().value("modelParamName").toString(); qDebug() << "topicName:" << topic_name << ",topicParamName:" << topic_param_name << ",modelParamName:" << model_param_name << endl; m_qxml_reader.readNext(); } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadEntitiesElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "Entities") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Entity") { QString object_handle = m_qxml_reader.attributes().value("objectHandle").toString(); qDebug() << "objectHandle:" << object_handle << endl; QString model_uuid = m_qxml_reader.attributes().value("modelUUID").toString(); qDebug() << "modelUUID:" << model_uuid<<endl; m_qxml_reader.readNext(); } else if (m_qxml_reader.name() == "Parameters") { ReadParametersElement(); } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::ReadModelsElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "Models") { m_qxml_reader.readNext(); break; } else m_qxml_reader.readNext(); } if (m_qxml_reader.isStartElement()) { if (m_qxml_reader.name() == "Model") { QString model_uuid = m_qxml_reader.attributes().value("modelUUID").toString(); qDebug() << "modelUUID:" << model_uuid<<endl; m_qxml_reader.readNext(); } else if (m_qxml_reader.name() == "Publish") { ReadPublishElement(); } else if (m_qxml_reader.name() == "Subscribe") { ReadSubscribeElement(); } else { SkipUnknownElement(); } } else { m_qxml_reader.readNext(); } } } void XmlStreamReader::SkipUnknownElement() { m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { if (m_qxml_reader.isEndElement()) { m_qxml_reader.readNext(); break; } if (m_qxml_reader.isStartElement()) { SkipUnknownElement(); } else { m_qxml_reader.readNext(); } } }
void writeIndexEntry(QXmlStreamWriter *xmlWriter, QTreeWidgetItem *item) { xmlWriter->writeStartElement("entry"); xmlWriter->writeAttribute("term", item->text(0)); QString pageString = item->text(1); if (!pageString.isEmpty()) { QStringList pages = pageString.split(", "); foreach(QString page, pages) xmlWriter->writeTextElement("page", page); } for (int i = 0; i < item->childCount(); ++i) writeIndexEntry(xmlWriter, item->child(i)); xmlWriter->writeEndElement(); } bool WriteXml(const QString &fileName, QTreeWidget *treeWidget) { QFile file(fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { std::cerr << "Error: Cannot write file "<< qPrintable(fileName) << ": " << qPrintable (file.errorString ()) << std :: endl; return false ; } QXmlStreamWriter XmlWriter ( & File); // turn on automatic format editing, XML documents will be more friendly readable format output, each row has a clear display recursive data structures indent xmlWriter.setAutoFormatting ( to true ); // write the first line in the XML document "<xml Version =?" 1.0 "encoding =" UTF-8 "?>" xmlWriter.writeStartDocument ( ); xmlWriter.writeStartElement ( " WantDecideEdit " ); for ( int I = 0 ; I <treeWidget-> topLevelItemCount ();++i) writeIndexEntry(&xmlWriter, treeWidget->topLevelItem(i)); xmlWriter.writeEndDocument(); file.close(); if (file.error()) { std::cerr << "Error: Cannot write file "<< qPrintable(fileName) << ": "<< qPrintable(file.errorString()) << std::endl; return false; } return true; }