Qt XML の変更点

Qt 6 は、フレームワークをより効率的で使いやすくするための意識的な努力の結果です。

私たちは各リリースにおいて、すべての公開APIのバイナリとソースの互換性を維持しようと努めています。しかし、Qt をより良いフレームワークにするために避けられない変更もあります。

このトピックでは、Qt XMLにおけるそれらの変更点を要約し、それらを扱うためのガイダンスを提供します。

Simple API for XML (SAX) パーサー

すべてのSAXクラスは Qt XML から削除されました。XML ファイルの読み込みにはQXmlStreamReader を使用してください。ここでは、現在のコードをQXmlStreamReader に移植するための簡単な手順を説明します:

例えば

QFile *file = new QFile(...);
QXmlInputSource *source = new QXmlInputSource(file);

Handler *handler = new Handler;

QXmlSimpleReader xmlReader;
xmlReader.setErrorHandler(handler);
xmlReader.setContentHandler(handler);

if (xmlReader.parse(source)) {
    ... // do processing
} else {
    ... // do error handling
}

のようなコードがあれば

QFile file = ...;
QXmlStreamReader reader(&file);

while (!reader.atEnd()) {
    reader.readNext();
    ... // do processing
}
if (reader.hasError()) {
    ... // do error handling
}

QDom と QDomDocument

SAXクラスが Qt XML から削除されたため、QDomDocumentQXmlStreamReader を使って再実装されました。これにより、いくつかの動作が変更されます:

  • 属性値は正規化されます。例えば、<tag attr=" a \n b " /><tag attr="a b"/> と同等です。
  • 同一の修飾属性名は許されなくなりました。つまり、要素の属性は一意な名前を持たなければなりません。
  • 宣言されていない名前空間接頭辞は許されなくなりました。

QDomDocument を使用し、これらのいずれかに依存している場合は、それに応じてコードと XML 文書を更新する必要があります。

スペーシングのみのテキスト・ノード

デフォルトでは、スペース文字のみを含むテキスト・ノードは取り除かれ、QDomDocument に表示されません。この動作を変更する Qt 5 の方法は、QXmlReader を指定できるQDomDocument::setContent() オーバーロードを使用することでした。このオーバーロードはQt 6.0で削除されましたが、Qt 6.5以降、QDomDocument::ParseOption::PreserveSpacingOnlyNodes をパースオプションとして渡すことで、スペーシングのみのテキストノードを保持するように指定できます。

Qt Core5 互換ライブラリ

あなたのアプリケーションやライブラリが今すぐ移植できない場合、QXmlSimpleReader と関連するクラスが Qt5Compat に存在し、古いコードベースの動作を維持します。これらの SAX クラスをさらに使用したい場合は、新しい Qt5Compat モジュールに対してリンクし、qmake .pro ファイルにこの行を追加する必要があります:

QT += core5compat

アプリケーションやライブラリをすでにcmakeビルドシステムに移植している場合は、次の行をCMakeList.txt に追加してください:

PUBLIC_LIBRARIES
    Qt::Core5Compat

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。