QT 4: программирование GUI на С++
Шрифт:
Рис. 15.3. Родственные связи между узлами DOM.
Для иллюстрации применения DOM при чтении файлов XML мы напишем парсер для файла предметного указателя книги, описанного в предыдущем разделе.
Мы
В конструкторе мы создаем объект QDomDocument и вызываем для него функцию setContent, чтобы с его помощью прочесть документ XML с устройства QIODevice. Функция setContent автоматически открывает устройство, если оно еще не открыто. Затем мы вызываем функцию documentElement для объекта QDomDocument, чтобы получить его одиночный дочерний элемент QDomElement, после чего мы проверяем, является ли данный элемент <bookindex>. Мы выполняем цикл по всем дочерним узлам, и если узлом является элемент <entry>, мы вызываем функцию parseEntry для его синтаксического анализа.
Класс QDomNode может хранить узлы любого типа. Если мы хотим продолжить обработку узла, мы должны сначала преобразовать его в правильный тип данных. В нашем примере нас интересуют только узлы Element, и поэтому мы вызываем функцию toElement объекта QDomNode для преобразования его в объект QDomElement и затем вызова функции tagName для получения имени тега элемента. Если данный узел не имеет тип Element, функция toElement возвращает нулевой объект типа QDomElement, содержащий пустое имя тега.
В
функции parseEntry мы создаем элемент объекта QTreeWidget. Если тег вложен в другой <entry>, новый тег определяет подэлемент предметного указателя, и мы создаем элемент QTreeWidgetItem как дочерний для внешнего элемента QTreeWidgetItem. В противном случае мы создаем элемент QTreeWidgetItem с treeWidget в качестве его родительского элемента, делая его элементом верхнего уровня. Мы вызываем функцию setText для установки текста столбца 0 на значение атрибута term тега <entry>.После инициализации нами элемента QTreeWidgetItem мы выполняем цикл по дочерним узлам элемента QDomElement, который соответствует текущему тегу <entry>.
Если элементом является <entry>, мы вызываем функцию parseEntry, передавая текущий элемент в качестве второго аргумента. Затем будет создан новый элемент QTreeWidgetItem, в качестве родительского элемента которого выступает внешний элемент QTreeWidgetItem.
Если элементом является <page>, мы просматриваем список дочерних элементов для поиска узла Text. После его обнаружения мы вызываем функцию toText для преобразования его в объект типа QDomText и функцию data для получения текста в виде строки типа QString. Затем мы добавляем текст в разделяемый запятыми список номеров страниц в столбце 1 элемента QTreeWidgetItem.