変更点Qt XML
Qt 6 における変更点は、フレームワークをより効率的で使いやすくするための意図的な取り組みの結果です。
各リリースにおいて、すべての公開 API についてバイナリおよびソースの互換性を維持するよう努めています。しかし、Qt をより優れたフレームワークにし、最新の標準に合わせるためには、いくつかの変更は避けられませんでした。
Qt 6 では、Qt 5 よりも XML 1.0 の規則が厳格に適用されます。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) パーサー
Qt XML からは、すべてのSAXクラスが削除されました。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クラスが削除されたことに伴い、QDomDocument はQXmlStreamReader を使用して再実装されました。これにより、動作にいくつかの変更が生じます:
- 属性値は正規化されます。例えば、
<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 の規則に従って正しく拒否されるようになりました。 これらは Qt 5 では誤って許可されていました。Qt 6 で XML を使用する前に、XML ドキュメントに XML 1.0 に準拠した有効な文字のみが含まれていることを確認してください。制御文字が必要な場合は、テキストセーフ形式を使用してエンコードしてください。
詳細については、XML 1.0 の文字を参照してください。
XML における HTML エンティティ
Qt 6 では、ドキュメント型定義 (DTD) で明示的に宣言されていない限り、HTML エンティティは有効ではなくなりました。 Qt 5 では、宣言がなくても特定の HTML 固有のエンティティ(例: )が許可されていました。Qt 6 での互換性を確保するには、数値文字参照を使用するか、必要なエンティティを DTD で定義するか、あるいはコンテンツが HTML エンティティに依存している場合は、代わりに XML を HTML として処理してください。
詳細については、XML 1.0におけるエンティティの文字エンコーディングを参照してください。
空白のみのテキストノード
デフォルトでは、空白文字のみを含むテキストノードは削除され、QDomDocument には表示されません。Qt 5 では、この動作を変更するために、QDomDocument::setContent() のオーバーロードを使用し、QXmlReader を指定することができました。 このオーバーロードは 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© 2026 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.