在 Qt 中使用包含 HTML 的节点解析 XML

发布于 2024-10-20 22:03:54 字数 1045 浏览 1 评论 0原文

我尝试在 Qt 中解析包含一些包含 HTML 的节点的 XML 文件,它看起来像这样:

<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 标签,因此第一个示例的文本将只是“Some text”。

可以通过更有效的方式做到这一点吗?

我想到了另一个解决方案,您觉得如何:

的内容包裹起来怎么样?在解析 xml 文件之前,CDATA 部分中的标签(使用字符串替换或正则表达式函数)?

I try to parse an XML file with some nodes containing HTML in Qt, it looks like this:

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

I tried different approaches in Qt, but getting the HTML from the node was somehow not possible (in an easy way).

QDomDocument:
The only way I found to get the text of a QDomElement:
Use the save() function (documentation), but then I would get the whole line "<element>...</element>", not just the inner text.

QXmlStreamReader
There is the function readElementText(QXmlStreamReader::IncludeChildElements) (documentation), but it removes the HTML tags, so the text of the first example would be only "Some text".

Can this be done in a more effective way?

I thought of another solution, what do you think about it:

How about wrapping the contents of the <element> tags in CDATA sections (using string replace or regex functions) before the xml file is parsed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玩套路吗 2024-10-27 22:03:54

QDomDocument 和 QXmlStreamReader 都无法解析 HTML。它们是 XML 解析器。要在 Qt 中解析 HTML,您应该使用 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"

Neither QDomDocument nor QXmlStreamReader is able to parse HTML. They are XML parsers. To parse HTML in Qt you should use 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();
}

Output:

"text"
各空 2024-10-27 22:03:54

执行此操作的 dom 方法应该是 nodeValue()。

The dom method of doing it should be nodeValue().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文