你的代碼完美地工作,如果下面的字符串被分配到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函數很難完成它! –