Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 86

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

endElement("quote")

endElement("doc")

endDocument()

ВсС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² классС QXmlContentHandler. Для простоты ΠΌΡ‹ Π½Π΅ стали ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ startElement() ΠΈ endElement().

QXmlContentHandler β€” это всСго лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… классов—обработчиков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно с классом QXmlSimpleReader. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚Π°ΠΊΠΈΠΌΠΈ классами ΡΠ²Π»ΡΡŽΡ‚ΡΡ QXmlEntityResolver, QXmlDTDHandler, QXmlErrorHandler, QXmlDeclHandler ΠΈ QXmlLexicalHandler. Π­Ρ‚ΠΈ классы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событиях синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΠΏΠΎΠ»Π½Π΅ достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лишь классы QXmlContentHandler ΠΈ QXmlErrorHandler.

Для удобства Qt Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт класс QXmlDefaultHandler, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт всС классы—обработчики ΠΈ обСспСчиваСт ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Вакая конструкция со мноТСством абстрактных классов—обработчиков ΠΈ ΠΎΠ΄Π½ΠΈΠΌ подклассом с Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Π° для Qt; ΠΎΠ½Π° принята для максимального соотвСтствия ΠΌΠΎΠ΄Π΅Π»ΠΈ Javaβ€”Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ способы примСнСния QXmlSimpleReader ΠΈ QXmlDefaultHandler для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ„Π°ΠΉΠ»Π° XML Π·Π°Ρ€Π°Π½Π΅Π΅ извСстного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΈ для отобраТСния Π΅Π³ΠΎ содСрТимого Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ QTreeWidget. Подкласс QXmlDefaultHandler ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ SaxHandler, ΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ указатСля ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит элСмСнты ΠΈ подэлСмСнты.

Рис. 15.1. Π”Π΅Ρ€Π΅Π²ΠΎ наслСдования для SaxHandler.

НиТС приводится Ρ„Π°ΠΉΠ» ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ указатСля ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отобраТаСтся Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ QTreeWidget ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 15.2:

<?xml version="1.0"?>

<bookindex>

<entry term="sidebearings">

<page>10</page>

<page>34-35</page>

<page>307-308</page>

</entry>

<entry term="subtraction">

<entry term="of pictures">

<page>115</page>

<page>244</page>

</entry>

<entry term="of vectors">

<page>9</page>

</entry>

</entry>

</bookindex>

Рис. 15.2. Π€Π°ΠΉΠ» ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ указатСля ΠΊΠ½ΠΈΠ³ΠΈ, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QTreeWidget.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ этап Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ парсСра Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании подкласса QXmlDefaultHandler:

01 class SaxHandler : public QXmlDefaultHandler

02 {

03 public:

04 SaxHandler(QTreeWidget *tree);

05 bool startElement(const QString &namespaceURI,

06 const QString &localName,

07 const QString &qName,

08 const QXmlAttributes &attributes);

09 bool endElement(const QString &namespaceURI,

10 const QString &localName,

11 const QString &qName);

12 bool characters(const QString &str);

13 bool fatalError(const QXmlParseException &exception);

14 private:

15 QTreeWidget *treeWidget;

16 QTreeWidgetItem *currentItem;

17 QString currentText;

18 };

Класс SaxHandler наслСдуСт QXmlDefaultHandler ΠΈ пСрСопрСдСляСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: startElement(), endElement(), characters() ΠΈ fatalError(). ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² QXmlContentHandler; послСдняя функция объявлСна Π² QXmlErrorHandler.

01 SaxHandler::SaxHandler(QTreeWidget *tree)

02 {

03 treeWidget = tree;

04 currentItem = 0;

05 }

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ SaxHandler ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QTreeWidget, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, содСрТащСйся Π² Ρ„Π°ΠΉΠ»Π΅ XML.

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

02 const QString & /* localName */,

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);

10 QXmlInputSource inputSource(&file);

11 QXmlSimpleReader reader;

12 SaxHandler handler(treeWidget);

13 reader.setContentHandler(&handler);

14 reader.setErrorHandler(&handler);

15 return reader.parse(inputSource);

16 }

ΠœΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π΄Π²Π° столбца Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ QTreeWidget. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QFile для считываСмого Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QXmlSimpleReader для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ„Π°ΠΉΠ»Π°. Нам Π½Π΅ трСбуСтся самим ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ QFile; QXmlInputSource Π΄Π΅Π»Π°Π΅Ρ‚ это автоматичСски.