Класс QDomNode может хранить узлы любого типа. Если мы хотим продолжить обработку узла, мы должны сначала преобразовать его в правильный тип данных. В нашем примере нас интересуют только узлы Element, и поэтому мы вызываем функцию toElement() объекта QDomNode для преобразования его в объект QDomElement и затем вызова функции tagName() для получения имени тега элемента. Если данный узел не имеет тип Element, функция toElement() возвращает нулевой объект типа QDomElement, содержащий пустое имя тега.

01 void DomParser::parseEntry(const QDomElement &element,

02 QTreeWidgetItem *parent)

03 {

04 QTreeWidgetItem *item;

05 if (parent) {

06 item = new QTreeWidgetTtem(parent);

07 } else {

08 item = new QTreeWidgetItem(treeWidget);

09 }

10 item->setText(0, element.attribute("term"));

11 QDomNode node = element.firstChild();

12 while (!node.isNull()) {

13 if (node.toElement().tagName() == "entry") {

14 parseEntry(node.toElement(), item);

15 } else if (node.toElement().tagName() == "page") {

16 QDomNode childNode = node.firstChild();

17 while (!childNode.isNull()) {

18 if (childNode.nodeType() == QDomNode::TextNode) {

19 QString page = childNode.toText().data();

20 QString allPages = item->text(1);

21 if (!allPages.isEmpty())

22 allPages += ", ";

23 allPages += page;

24 item->setText(1, allPages);

25 break;

26 }

27 childNode = childNode.nextSibling();

28 }

29 }

30 node = node.nextSibling();

31 }

32 }

В функции parseEntry() мы создаем элемент объекта QTreeWidget. Если тег вложен в другой , новый тег определяет подэлемент предметного указателя, и мы создаем элемент QTreeWidgetItem как дочерний для внешнего элемента QTreeWidgetItem. В противном случае мы создаем элемент QTreeWidgetItem с treeWidget в качестве его родительского элемента, делая его элементом верхнего уровня. Мы вызываем функцию setText() для установки текста столбца 0 на значение атрибута term тега .

После инициализации нами элемента QTreeWidgetItem мы выполняем цикл по дочерним узлам элемента QDomElement, который соответствует текущему тегу .

Если элементом является , мы вызываем функцию parseEntry(), передавая текущий элемент в качестве второго аргумента. Затем будет создан новый элемент QTreeWidgetItem, в качестве родительского элемента которого выступает внешний элемент QTreeWidgetItem.

Если элементом является , мы просматриваем список дочерних элементов для поиска узла Text. После его обнаружения мы вызываем функцию toText() для преобразования его в объект типа QDomText и функцию data() для получения текста в виде строки типа QString. Затем мы добавляем текст в разделяемый запятыми список номеров страниц в столбце 1 элемента QTreeWidgetItem.

Давайте теперь посмотрим, как мы можем использовать класс DomParser для синтаксического анализа файла:

01 void parseFile(const QString &fileName)

02 {

03 QStringList labels;

04 labels << QObject::tr("Terms") << QObject::tr("Pages");

05 QTreeWidget *treeWidget = new QTreeWidget;

Перейти на страницу:

Похожие книги