1. 程式人生 > >Qt-QML-C++互動實現檔案IO系統-後繼-讀取XML檔案和建立XML檔案

Qt-QML-C++互動實現檔案IO系統-後繼-讀取XML檔案和建立XML檔案

在前面兩篇中,大致完成了一個檔案IO的讀和寫操作。前面兩篇文章連結

今天這個是,今天主要是寫了怎麼把配置檔案寫入到XML中

上今天的詳程式碼

QJsonObject DLFileIOSystem::DLReadXML()
{
    qDebug()<<"XML 讀取函式執行";

    QFile file("./config.xml");         //開啟XMl檔案
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::information(NULL,"Title","Open File False");       //如果開啟失敗則提示
    }
    QDomDocument doc;               //把檔案內容寫入到doc中
    doc.setContent(&file);
    file.close();               //關閉檔案

    QDomElement root = doc.documentElement();

    QDomNode node = root.firstChild();
    while (!node.isNull())
    {
        QDomElement element = node.toElement();
        if(!element.isNull())
        {
            QDomNamedNodeMap list = element.attributes();
            for(int i = 0; i<list.count(); i++)
            {
                xmlDate.insert(list.item(i).nodeName(),list.item(i).nodeValue());
                qDebug()<<list.item(i).nodeName();
            }
        }
        node = node.nextSibling();
    }









    return xmlDate;
}

bool DLFileIOSystem::DJWriteXML()
{
    qDebug()<<"XML 讀取函式執行";




    QFile file("./config.xml");         //開啟XMl檔案
    if(!file.open(QFile::ReadWrite | QFile::Text | QFile::Truncate))            //這裡需要注意的是,寫入檔案的時候需要以覆蓋的方式
    {
        QMessageBox::information(NULL,"Title","Open File False");       //如果開啟失敗則提示
    }

    QTextStream out(&file);
    QTextCodec *codec = QTextCodec::codecForName("gbk");
    out.setCodec(codec);
    QDomDocument doc;               //把檔案內容寫入到doc中
    doc.setContent(&file);
    QDomElement root = doc.createElement("Root");
    QDomElement date = doc.createElement("XMLDate");

    QStringList list = xmlDate.keys();
    for(int i = 0; i<list.count(); i++)
    {
        date.setAttribute(list.at(i),xmlDate.value(list.at(i)).toString());
    }

    root.appendChild(date);
    QString strHead("version = \"1.0\" encoding = \"GB2312\"");
    doc.appendChild(doc.createProcessingInstruction("xml",strHead));
    out<<doc.toString();
    root.save(out,2);
    file.close();               //關閉檔案
    QMessageBox::warning(NULL,"提示","檔案寫入完成");
    return true;
}
一個讀檔案,一個寫檔案

這裡要參考以為牛逼大大的文章

剩下的就不用在說了,看到前面

這裡還有一個問題了就是,前幾天沒有弄出來的一點,這裡要說明一下,

//    property JSON date : FileIOSystem.DLReadFile()

//    property QJSON name: value

    property var xmljson: FileIOSystem.DLReadXML()

只有最後一種方式是正確的,把C++傳來的QJsonObject定義成一個json屬性

完了就可以在後面的內容中愉快的使用了


程式碼結構