使用QDomDocument数据作为文本的更好方法

时间:2018-07-23 06:39:08

标签: c++ qt text qdomdocument

我是新手,正在创建一个XML文件,我需要在其中提供CRC值以在服务器上进行交叉检查。为此,我需要QDomDocument数据作为文本。为此,我首先创建具有伪XML值的CRC文件。然后,我用QFile打开它并读取所有数据。然后我分割数据并计算数据CRC。现在,我必须再次重写整个文件。我知道两次写入同一文件是最糟糕的主意,但是由于我是新手,所以我不知道如何以更好的方式进行处理。这是我的代码:-

QDomElement docElem = doc.documentElement();
QFile xmlfile(filename);
if(!xmlfile.open(QIODevice::ReadWrite | QIODevice::Text))
{
    qDebug("Can not open file device.");
}
xmlfile.resize(0);
QXmlStreamWriter xw;
xw.setDevice(&xmlfile);      //set file to XML writer
xw.setAutoFormatting(true);
xw.setAutoFormattingIndent(4);
xw.writeStartDocument();
xw.writeStartElement(fileID); //fileID as the start element
if(docElem.hasAttributes())
{
    xw.writeAttribute("xmlns:xs",docElem.attribute("xmlns:xs"));
    xw.writeAttribute("xmlns",docElem.attribute("xmlns"));
}

xw.writeTextElement("Frame_Start_ID","STX");
xw.writeTextElement("Frame_Length","1234");
xw.writeTextElement("Source_Device_Id","CDIS_PIS ");
xw.writeTextElement("Destination_Device_Id","DDNS-SERVER ");
xw.writeTextElement("Frame_Code","I");
xw.writeStartElement("Frame_Data");
//inside frame data
xw.writeTextElement("File_Number","1");
xw.writeTextElement("File_Name","Event");

for(int j=0;j<logFields.count();j++)
{
    xw.writeTextElement(logFields.at(j),logData.at(j));
}
xw.writeEndElement();
xw.writeTextElement("CRC","14405904");
xw.writeTextElement("Frame_End_Id","ETX");
xw.writeEndDocument();
xmlfile.flush();
xmlfile.close();



   QFile xmlfyle(filename);

    xmlfyle.open(QIODevice::ReadWrite | QIODevice::Text);
    QString content = (QString)xmlfyle.readAll();
    QStringList list1 = content.split("<CRC>");

    qDebug() << "Split value = " << list1.at(0);
    QByteArray crc_new = crc_o.crc_generate_modbus((unsigned char*)list1.at(0).data(),list1.at(0).size());
    xmlfyle.resize(0);
    QXmlStreamWriter xw_new;
    xw_new.setDevice(&xmlfyle);      //set file to XML writer
    xw_new.setAutoFormatting(true);
    xw_new.setAutoFormattingIndent(4);
    xw_new.writeStartDocument();
    xw_new.writeStartElement(fileID); //fileID as the start element

     if(docElem.hasAttributes())
    {
        xw_new.writeAttribute("xmlns:xs",docElem.attribute("xmlns:xs"));
        xw_new.writeAttribute("xmlns",docElem.attribute("xmlns"));
    }

    xw_new.writeTextElement("Frame_Start_ID","STX");
    xw_new.writeTextElement("Frame_Length","1234");
    xw_new.writeTextElement("Source_Device_Id","CDIS_PIS ");
    xw_new.writeTextElement("Destination_Device_Id","DDNS-SERVER ");
    xw_new.writeTextElement("Frame_Code","I");
    xw_new.writeStartElement("Frame_Data");
    xw_new.writeTextElement("File_Number","1");
    xw_new.writeTextElement("File_Name","Event");
    for(int j=0;j<logFields.count();j++)
    {
        xw_new.writeTextElement(logFields.at(j),logData.at(j));
    }
    xw_new.writeEndElement();
    char tab[10];
    sprintf(tab,"%d",crc_new.data());
    xw_new.writeTextElement("CRC",QString::fromUtf8(tab));
    xw_new.writeTextElement("Frame_End_Id","ETX");
    xw_new.writeEndDocument();
    xmlfyle.flush();
    xmlfyle.close();

有人可以建议我做一个更好的方法吗?谢谢

1 个答案:

答案 0 :(得分:1)

QXmlStreamWriter构造函数的一个版本接受QByteArray并写入数组而不是输出文件。

QXmlStreamWriter Class

所以您可以做的是;使用QXmlStreamWriter,在QByteArray中为您的XML准备数据,对数据中的CRC做任何您需要做的事情;并在完成所有操作后,将此QByteArray写入输出文件。