Qtの基礎 - XML
提供: MochiuWiki : SUSE, EC, PCB
📢 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;
}