#ifndef SIM_XMLSTREAMREADER_H_ #define SIM_XMLSTREAMREADER_H_ #include <QString> #include <QXmlStreamReader> class XmlStreamReader { public: XmlStreamReader(); ~XmlStreamReader(); //讀取文件 bool ReadFile(const QString &fileName); //跳過不能識別的元素 void SkipUnknownElement(); //讀取XML文件的主體部分 void ReadWantDecideEditElement(); //解析想定基本信息 void ReadScenarioElement(); //解析想定文件實體信息 void ReadEntitiesElement(); //解析想定文件模型發布訂閱關系 void ReadModelsElement(); //解析該實體的所有參數 void ReadParametersElement(); //解析發布關系 void ReadPublishElement(); //解析訂閱關系 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; } //如果文件打開成功,將它設置為QXmlStreamReader的輸入設備 m_qxml_reader.setDevice(&file); //readNext()函數從輸入流中讀取下一個記號,如果成功而且還沒有到達XML文件的結尾,函數將進入while循環, //每次調用readNext()函數,下一個記號就會被讀取並變成當前的記號,readNext()函數報告error,atEnd返回true m_qxml_reader.readNext(); //當讀取到XML文檔結尾,或者發生錯誤,atEnd()函數返回true while (!m_qxml_reader.atEnd()) { //如果當前記號為StartElement,返回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() { //跳過當前記號,只可能是WantDecideEdit記號 m_qxml_reader.readNext(); while (!m_qxml_reader.atEnd()) { //如果讀取到關閉標簽,只能是</WantDecideEdit>記號,跳過這個標簽並跳出循環 if (m_qxml_reader.isEndElement()) { if (m_qxml_reader.name() == "WantDecideEdit") { m_qxml_reader.readNext(); break; } 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() << "name:" << name << " " << "type:" << type << " " << "display_name:" << display_name << " " << "usage:" << usage << " " << "value:" << value << endl; m_qxml_reader.readNext(); } else { SkipUnknownElement(); } } else { 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); //開啟自動格式編輯功能,XML文檔將以更友好易讀的格式輸出,在每一行都有明確顯示數據遞歸結構的縮進 xmlWriter.setAutoFormatting(true); //在XML文檔首行寫"<?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; }
