Qtの基礎 - XML

提供: MochiuWiki : SUSE, EC, PCB

2024年3月30日 (土) 08:34時点におけるWiki (トーク | 投稿記録)による版 (Xerces-C++ライブラリ)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要



QXmlStreamReaderクラス

QXmlStreamReaderクラスとは

QXmlStreamReaderクラスは、XMLをシンプルなストリーミングAPIで読み込むための高速パーサである。

ストリームリーダの基本的なコンセプトは、XMLドキュメントをトークンのストリームとして読み込むことである。
QXmlStreamReaderクラスとSAXの主な違いは、これらのXMLトークンの読み込み手順である。

  • SAXの場合
    アプリケーションはパーサの都合に合わせてパーサからXMLイベントを受信するハンドラ (コールバック関数) を提供する必要がある。
  • QXmlStreamReaderの場合
    繰り返し文を使用して、必要なトークンを次々にリーダから取り出すことができる。
    これは、readNextメソッドを呼び出すことで実行され、リーダは次のトークンを完了するまで入力ストリームから読み取り、tokenTypeメソッドを返す。
    その後、isStartElementメソッドやtextメソッド等を使用してトークンを確認することにより、読み込まれているタグや要素についての情報を得ることができる。


このプルアプローチのメリットは、再帰降順パーサを構築して、XMLを異なるメソッドやクラスに分割できることである。
これにより、XMLの解析を簡単に追跡することができる。

要素の取得例

以下の例では、XMLファイルを読み込み、要素titleの値を抽出してコンソールへ出力している。

 #include <QXmlStreamReader>
 #include <QFile>
 #include <QTextStream>
 
 // XMLファイルを開く
 QFile File("<XMLファイルのパス  例: hoge.xml>");
 if(!File.open(QIODevice::ReadOnly)) {
    std::cout << QString("ファイルのオープンに失敗 : %1").arg(File.errorString()) << std::endl;
    return;
 }
 
 // XMLファイルを読み込む
 QTextStream InStream(&File);
 QString XMLData = InStream.readAll();
 File.close();
 
 // XMLファイルから特定の要素を抽出
 QXmlStreamReader xml(XMLData);
 while (!xml.atEnd() && !xml.hasError()) {
    QXmlStreamReader::TokenType token = xml.readNext();
    if (token == QXmlStreamReader::StartElement) {
       if (xml.name() == "title") {
          // 特定の要素が存在する場合は値をコンソールへ出力
          xml.readNext();
          std::cout << QString("Title : %1").arg(xml.text().toString()).toStdString() << std::endl;
       }
    }
 }
 
 if (xml.hasError()) {
    std::cerr << QString("XML Error : %1").arg(xml.errorString()).toStdString() << std::endl;
 }