Home > Веб-разработка > Разбор XML-документа средствами Qt. Пример работы с XML

Разбор XML-документа средствами Qt. Пример работы с XML

Случилось мне получать данные от стороннего вебсервиса. Все они шли в XML формате. Вроде бы и хорошо, все данные четко структурированы, но вот количество служебных тегов оказалось во первых больше чем данных, во вторых было много вложеных одинаковых тегов без каких либо атрибутов или пометок. Вобщем если выбирать то небольшое количество нужной информации из такого обилия тегов, я бы написал парсер специально под задачу, используя обычные строковые функции. Такой парсер быстро читал бы текст, опирался бы на опорные слова и откладывал нужные данные в сторону. Но поскольку в документе было полно одинаковых тегов, а данные были похожи, но отличались уровнем вложености, то сфокусироваться на них оказалось не просто. Поэтому решил использовать классы по работе с объектной структурой XML-документа.

Хотя для этого мне и пришлось добавить в проект XML модуль, но оказалось что вариант с построением дерева не такой и медленный, так что мне подошел. Итак для работы с XML-документом мне хватило двух классов QDomDocument и QDomElement.

Создаем объект в котором будет хранится объектная модель документа и загружаем в него содержимое XML файла:

QDomDocument some_dom;
some_dom.setContent(*data);

Далее нам понадобится объект класса QDomElement чтобы работать с определенным узлом документа:

QDomElement site_info;

В моем случае я загрузил в него первого потомка из узла в котором их было много:

site_info = some_dom.firstChildElement("methodResponse")
                        .firstChildElement("params")
                        .firstChildElement("param")
                        .firstChildElement("value")
                        .firstChildElement("array")
                        .firstChildElement("data")
                        .firstChildElement("value");

Чтобы перебрать всех потомков узла будем вызывать метод .nextSiblingElement() у текущего потомка, который возвращает соседний узел. Когда узел окажется последним, метод вместо объекта класса QDomElement вернет Null:

for (;!site_info.isNull();site_info = site_info.nextSiblingElement())
{
   // некоторые операции с данными
   ...
}

Методом text() можно получить содержимое узла в виде строки. Для примера получим содержимое первого тега name:

QString site_name = site_info.firstChildElement("name").text();

Не забудьте добавить в файл проекта строку:

 QT += xml

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

?

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

TOP