Разбор XML с узлами, содержащими HTML в Qt - PullRequest
0 голосов
/ 05 марта 2011

Я пытаюсь проанализировать XML-файл с некоторыми узлами, содержащими HTML, в Qt, это выглядит так:

<root>
 <list>
  <element>Some <i>text<i></element>
  <element><b>another line of text<b></element>
  <element><i>Tag opened here</element>
  <element>and closed here</i></element>
 </list>
</root>

Я пробовал разные подходы в Qt, но получить HTML от узла было как-то не возможно(простым способом).

QDomDocument :Единственный способ найти текст QDomElement: использовать функцию save () ( документация ), но тогда я получу всю строку " ... ", а нетолько внутренний текст.

QXmlStreamReader Существует функция readElementText (QXmlStreamReader :: IncludeChildElements) ( документация ), но она удаляет теги HTML, поэтому текст первого примера будет содержать только «Некоторый текст».

Можетэто будет сделано более эффективным способом?

Я подумал о другом решении, что вы об этом думаете:

Как насчет упаковки содержимого тегов в разделы CDATA (используяфункции замены строк или регулярных выражений) до анализа файла xml?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Ни QDomDocument, ни QXmlStreamReader не могут анализировать HTML.Это парсеры XML.Для разбора HTML в Qt вы должны использовать QtWebKit.

#include <QtCore>
#include <QtGui>
#include <QtWebKit>

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    QString html =
    "                                                   \\
    <root>                                              \\
     <list>                                             \\
      <element>Some <i>text<i></element>                \\
      <element><b>another line of text<b></element>     \\
      <element><i>Tag opened here</element>             \\
      <element>and closed here</i></element>            \\
     </list>                                            \\
    </root>                                             \\
    ";

    QWebPage page;
    page.mainFrame()->setHtml(html);
    QWebElement htmlElement = page.mainFrame()->findFirstElement("root list element i");
    qDebug() << htmlElement.toPlainText();

    return app.exec();
}

Вывод:

"text"
0 голосов
/ 05 марта 2011

Для этого нужно использовать метод nodeValue ().

...