2012年2月12日日曜日

( Qt C++ )XMLの書き込み(DOM編)


はいそれでは表題の件やっていきます。
今回はDOMを使ってXMLを生成し、ファイルに書き込んでいきます。
(DOMについては前の記事やwikiで調べてください。)

サンプルはC++ GUI Programming with Qt4 348ページのものをやや変更して使用します。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)

なお、.proファイルに Qt += xml の記述をしておいてください。でなければQXml関連をコードに含められません。

ではコードを

(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QFile file("C:\\Users\\windows7\\Desktop\\test.txt");
    
    if (file.open(QFile::WriteOnly| QFile::Truncate))
    {
        const int Indent = 4;
        QDomDocument doc;
        
        QDomElement root = doc.createElement("doc");
        QDomElement quote = doc.createElement("quote");
        QDomElement translation = doc.createElement("sample");
        
        QDomText latin = doc.createTextNode("Writting XML Sample");
        QDomText english = doc.createTextNode("Hello Sample XML !!");
        
        doc.appendChild(root);
        
        root.appendChild(quote);
        root.appendChild(translation);
        
        quote.appendChild(latin);
        
        translation.appendChild(english);
        
        QTextStream out(&file);
        doc.save(out, Indent);//第2引数はインデントのスペース数
    }
}

はい簡単ですね。
まずcreateElementで要素をそれぞれ作成しています。次に内容にセットするためのテキストをcreateTextNodeで作成し、それぞれツリーにappendChildでセットしていきます。最後にsaveでファイルに書き出しています。
(QDomDocumentリファレンス)


書き出したファイルの内容は以下のようになります。

<doc>
    <quote>Writting XML Sample</quote>
    <sample>Hello Sample XML !!</sample>
</doc>

以上です。


※補足:他のエンコーディングを使うようにXMLファイル先頭で宣言するには、下記のように書けばいいようです。
QTextStream out(&file);
QDomNode xmlNode = doc.createProcessingInstruction("xml",
"version=\"1.0\" encoding=\"ISO-8859-1\"");
doc.insertBefore(xmlNode, doc.firstChild());
doc.save(out, Indent);