Прошло много времени с тех пор, как в статьях касались парсинга 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-документов соответствующим образом.