Пройшло багато часу з того часу, як у статтях стосувалися парсингу XML-документів за допомогою Qt. Хотілося б розповісти деякі нові новини про очікувані зміни в наступних випусках. Але спочатку давайте підіб'ємо підсумки того, що в даний час Qt надає для читання та запису документів XML.
Модуль Qt XML
Цей модуль надає реалізацію для двох різних моделей для читання та запису файлів XML: об'єктна модель документа (Document Object Model DOM) та простий API для XML (SAX). У моделі DOM повний XML-файл завантажується в пам'ять і представляється як дерева, що забезпечує легкий доступ і маніпулювання його вузлами. DOM, як правило, використовується в програмах, де ви не дбаєте про пам'ять. З іншого боку, SAX є аналізатором XML на основі подій і не завантажує весь XML-документ на згадку. Натомість він генерує події для токенів під час парсингу, і користувач може обробити ці події. Програма повинна реалізувати інтерфейси обробника (цілком або частково з використанням QXmlDefaultHandler). Багато людей вважають це незручним, так як це змушує їх структурувати свій код навколо цієї моделі.
Інша проблема полягає в тому, що поточна реалізація SAX (і, як наслідок, DOM, оскільки вона реалізована з використанням SAX) не є повністю сумісною зі стандартом XML. Зважаючи на ці недоліки, Qt більше не рекомендує використовувати SAX, і було прийнято рішення відмовитися від цих класів, починаючи з Qt 5.15.
QXmlStreamReader і QXmlStreamWriter
На щастя, Qt надає потокові класи XML, як зручнішу та суміснішу зі стандартом XML альтернативу для роботи з файлами XML.
Що зміниться в Qt 6?
Як уже згадувалося вище, класи SAX незабаром будуть застарілими, що означає, що QDomDocument більше не зможе їх використовувати. Саме тому він був повторно реалізований з використанням QXmlStreamReader. Qt 6 переключиться на нову реалізацію, але старіші версії Qt, як і раніше, будуть використовувати стару реалізацію, оскільки нова принесе кілька поведінкових змін, а розробники не хочуть робити це до Qt 6.
Що ця зміна означає для користувачів Qt DOM? Оскільки QXmlStreamReader більш точно слід специфікації XML, QDomDocument буде робити те саме, починаючи з Qt 6. Це означатиме наступні зміни поведінки для QDomDocument:
•
Значення атрибутів будуть нормалізовані
. Наприклад,
•
Ідентичні кваліфіковані імена атрибутів більше не будуть дозволені
, тобто атрибути елемента повинні мати унікальні імена.
•
оголошені префікси простору імен більше не будуть дозволені
.
Якщо ви використовуєте QDomDocument та покладаєтеся на будь-який з них, розгляньте можливість оновлення вашого коду та XML-документів відповідним чином.