Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

03 const QString &qName,

04 const QXmlAttributes &attributes)

05 {

06 if (qName == "entry") {

07 if (currentItem) {

08 currentItem = new QTreeWidgetItem(currentItem);

09 } else {

10 currentItem = new QTreeWidgetItem(treeWidget);

11 }

12 currentItem->setText(0, attributes.value("term"));

13 } else if (qName == "page") {

14 currentText.clear;

15 }

16 return true;

17 }

Функция startElement

вызывается, когда обнаруживается новый открывающий тег. Третий параметр представляет собой имя тега (или точнее — «подходящее имя»). В четвертом параметре задается список атрибутов. В этом примере мы игнорируем первый и второй параметры. Они полезны для тех файлов XML, которые используют механизм пространств имен, подробно описанный в справочной документации.

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

Если обнаружен тег <page>, мы устанавливаем значение переменной currentText на пустую строку. В переменной currentText накапливается текст, расположенный между тегами <page> и </page>.

В конце мы возвращаем true, указывая SAX на необходимость продолжения синтаксического анализа файла. Если бы нам нужно было сообщить об ошибке из-за обнаружения неизвестного тега, мы возвращали бы в этих случаях false. Нам также потребовалось бы переопределить функцию errorString класса QXmlDefaultHandler для возврата соответствующего сообщения об ошибке.

01 bool SaxHandler::characters(const QString &str)

02 {

03 currentText += str;

04 return true;

05 }

Функция characters используется для извлечения символьных данных из документа XML. Мы просто добавляем символы в конец переменной currentText.

01 bool SaxHandler::endElement(const QString & /* namespaceURI */,

02 const QString & /* localName */, const QString &qName)

03 {

04 if (qName == "entry") {

05 currentItem = currentItem->parent;

06 } else if (qName == "page") {

07 if (currentItem) {

08 QString allPages = currentItem->text(1);

09 if (!allPages.isEmpty)

10 allPages += ", ";

11 allPages += currentText;

12 currentItem->setText(1, allPages);

13 }

14 }

15 return true;

16 }

Функция endElement вызывается

при обнаружении закрывающего тега. Так же как и для функции startElement, ее третий параметр содержит имя тега.

Если обнаружен тег </entry>, мы устанавливаем закрытую переменную currentItem на родительский элемент текущего элемента QTreeWidgetItem. Это обеспечивает восстановление переменной currentItem на значение, которое она имела перед чтением соответствующего тега <entry>.

Если обнаружен тег </page>, мы добавляем указанный номер страницы или диапазон страниц в разделяемый запятыми список в столбце 1 текущего элемента.

01 bool SaxHandler::fatalError(const QXmlParseException &exception)

02 {

03 QMessageBox::warning(0, QObject::tr("SAX Handler"),

04 QObject::tr("Parse error at line %1, column %2:\n%3.")

05 .arg(exception.lineNumber)

06 .arg(exception.columnNumber)

07 .arg(exception.message));

08 return false;

09 }

Функция fatalError вызывается, когда синтаксический анализ файла XML завершается неудачей. В этом случае мы просто выводим на экран сообщение, указывая номер строки, номер столбца и текст об ошибке синтаксического анализа.

Этим мы завершаем реализацию класса SaxHandler. Теперь давайте посмотрим, как можно использовать этот класс:

01 bool parseFile(const QString &fileName)

02 {

03 QStringList labels;

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

05 QTreeWidget *treeWidget = new QTreeWidget;

06 treeWidget->setHeaderLabels(labels);

07 treeWidget->setWindowTitle(QObject::tr("SAX Handler"));

08 treeWidget->show;

09 QFile file(fileName);

Поделиться:
Популярные книги

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Виконт, который любил меня

Куин Джулия
2. Бриджертоны
Любовные романы:
исторические любовные романы
9.13
рейтинг книги
Виконт, который любил меня

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Древесный маг Орловского княжества 13

Павлов Игорь Васильевич
13. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 13

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Неучтенный элемент. Том 5

NikL
5. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 5

Мажор. Дилогия.

Соколов Вячеслав Иванович
Фантастика:
боевая фантастика
8.05
рейтинг книги
Мажор. Дилогия.

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Простолюдин

Рокотов Алексей
1. Путь князя
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Простолюдин

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Граф Книга третья

Первухин Андрей Евгеньевич
10. Ученик
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Граф Книга третья