Qt read and write XML documents

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;
}

 

Guess you like

Origin www.cnblogs.com/LuckCoder/p/10942373.html