你的代码完美地工作,如果下面的字符串被分配到html_code
:
QString html_code = "<span class=\"title\">Some name here</span>";
然而,对于更复杂的文档,你可以考虑重,但功能强大的工具QtWebKit
的使用和其提供了访问(X)HTML文档的DOM元素的树结构的QWebElement
class。它可以让你只搜索首先感兴趣的条目的特定标签(或更复杂的结构)或集合,例如
#include <QWebPage>
#include <QWebFrame>
#include <QWebElement>
void MainWindow::some_handler()
{
QString html_code = "<span class=\"title\">Some name here</span>"
"<span class=\"title\">Some other name here</span>";
QWebPage page;
QWebFrame *frame = page.mainFrame();
frame->setHtml(html_code);
QWebElement document = frame->documentElement();
// one item
QWebElement title = document.findFirst("span.title");
QString text;
text += "First title span:\n\t" + title.toPlainText() + '\n';
// all items
QWebElementCollection title_collection = document.findAll("span.title");
text += "\nAll title spans:\n";
foreach (QWebElement elem, title_collection) {
text += '\t' + elem.toPlainText() + '\n';
}
ui->searchBox->setPlainText(text);
}
以下模块应在项目文件QT += webkitwidgets
被添加到构建上面的代码。
请注意,QWebPage
对象就像浏览器一样工作。它加载链接的内容并运行JavaScript。如果不需要其他xml解析器,例如Qt XML module。此模块不被支持,但它也通过QDomDocument
,QDomElement
和QDomNodeList
类为文档元素的树结构提供API。该代码是不是很好,与QWebElement
,因为这需要遍历节点列表,并手动检查节点类型及其attribude“类”,例如
QDomDocument document;
document.setContent(html_code);
QDomElement elem = document.documentElement();
QDomNodeList node_list = elem.elementsByTagName("span");
QString text;
for (int i = 0; i < node_list.length(); ++i) {
if (node_list.at(i).isElement() &&
node_list.at(i).toElement().attribute("class") == "title")
{
text += node_list.at(i).toElement().text() + '\n';
}
}
的Qt WebKit的已被废弃,不应该被推荐在此刻。此外,假设您可以使用XML解析器解析HTML而不先通过HTML到XHTML转换器运行它,这并不安全。 – MrEricSir
@MrEricSir,感谢您的有用评论。我同意这两点。不幸的是,Qt WebKit弃用并未在其活跃的Qt 5.5文档中直接提及,但有一些帖子与此相关。因此,开发人员必须对前向兼容性做出选择。 –
@OrestHera,我想知道我的“感谢”评论如何被删除!这解决了我的问题!谢谢!通过indexOf函数很难完成它! –