変更点Qt XML

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

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

Qt 6 では XML 1.0 のルールが Qt 5 よりも厳格になりました。Qt 5 では XML パーサーがより甘く、XML 1.0 仕様に準拠しない特定のコンストラクトを許可していました。Qt 6 ではこの動作が修正され、XML の扱いが標準に正しく従うようになりました。Qt 5 で誤って許可されていた動作に依存しているアプリケーションでは、XML ドキュメントや処理ロジックを調整する必要があるかもしれません。

XML 1.0 のルールの詳細については、W3C の公式 XML 仕様を参照してください:Extensible Markup Language (XML) 1.0 (Fifth Edition) を参照してください。

このトピックでは、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

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

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

詳細はXML 1.0における属性値の正規化

制御文字

Qt 6 では、U+0000-U+001F、U+007F、U+0080-U+009F などの制御文字が XML 1.0 のルールに従って正しく拒否されるようになりました。Qt6 で XML を使用する前に、XML ドキュメントに有効な XML 1.0 準拠の文字のみが含まれていることを確認してください。制御文字が必要な場合は、テキストセーフ形式でエンコードしてください。

詳細はXML 1.0 の文字

XML の HTML エンティティ

Qt 6 では、HTML エンティティは、Document Type Definition (DTD) で明示的に宣言されていない限り、無効となりました。Qt 5 では、HTML 固有のエンティティ(例えば、&nbsp;)は、宣言がなくても許可されていました。Qt 6 での互換性を確保するには、数値文字参照を使用するか、DTD で必要なエンティティを定義するか、コンテンツが HTML エンティティに依存している場合は、代わりに XML を HTML として処理してください。

詳細はXML 1.0 のエンティティにおける文字エンコーディング

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

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

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

Qt Core5 互換ライブラリ

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

QT += core5compat

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

PUBLIC_LIBRARIES
    Qt::Core5Compat

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.