1

我是一个新手,我正在创建一个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();

谁能建议我有什么更好的方法来做到这一点。谢谢

4

1 回答 1

1

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

QXmlStreamWriter 类

所以你可以做的是;使用QXmlStreamWriter,在 QByteArray 中为您准备数据,对这些数据XML执行您需要做的任何事情CRC;一切都完成后,将QByteArray其写入输出文件。

于 2018-07-23T07:31:52.777 回答