2011-12-19 3 views
1

C++とQtを学ぶという目的のために、ローカルディレクトリからHTMLファイル(数百まで)を読み込み、変更して別のローカルディレクトリに書き戻すQtベースの小さなプログラムを書いています。QWebPageの代わりにバックグラウンドでHTMLページを解析して変更するのにQTextBrowserを使用する価値はありますか?

私の最初の試みは、QWebPageと、QWebElementが提供するHTML解析機能を使用していました。しかし、私はメモリリークのいくつかの重大な問題に遭遇するQWebPage(これは正しい方法を使用して私の不足が原因で非常に可能性が高いですが、これは別のトピックであり、この質問の一部ではありません)。

これまでのところ、私はGUIを使用していないし、後でそれを行うつもりだが、私のプログラムのこの部分は決してGUIの一部ではなく、バックグラウンドのどこかにある。
したがって、私はQWebPageの使用をQTextBrowserに置き換えましたが、これはより軽量に見えます。しかし、Qt-APIの関数は、構文解析関数QWebElementに似ています。これまでのところ、私のコードはQWebElement::findFirst(),QWebElement::nextSibling()そして最後にQWebElement::takeFromDocument()に依存しています。

したがって、QTextBrowserをHTMLパーサーとして実装(または使用)する可能性はほとんどありませんか?たぶん「ベストプラクティス」ですか?
JavaScriptを評価する必要はありませんが、HTMLページにインライン展開されている可能性があります。また、CSSをスタイリングに使用する必要はありませんが、HTMLページで頻繁に使用されています。私は、idやCSSクラスに基づいて特定のHTMLブロック(テーブル行など)を取得するだけです。

PS:純粋なQtを使用するすべての実行可能かつ合理的な試みが失敗した場合、現在のC++ HTML解析ライブラリを使用したいと思います。

PPS:これを見て知るために、私は今も驚くべき解決策を得たいと思っています。 ;-)


は、ここで私が解析し、QWebElementを使用してHTMLページの特定の部分を削除し、私の現在のコードの一部です。 reportPageQWebPageオブジェクトです。

reportPage->document().findFirst("table[id=gadgettable]").findFirst("tr[class=c2]").takeFromDocument(); 
reportPage->mainFrame()->documentElement().findFirst("table[id=gadgettable]").findFirst("tr").takeFromDocument(); 
reportPage->mainFrame()->documentElement().findFirst("table[id=gadgettable]").findFirst("td[id=gadgettable-left-td]").takeFromDocument(); 
reportPage->mainFrame()->documentElement().findFirst("table[id=gadgettable]").findFirst("td[id=gadgettable-right-td]").takeFromDocument(); 
reportPage->mainFrame()->documentElement().findFirst("table[id=gadgettable]").findFirst("tr").nextSibling().takeFromDocument(); 
reportPage->mainFrame()->documentElement().findFirst("table[id=gadgettable]").findFirst("tr").nextSibling().takeFromDocument(); 

答えて

2

QTextBrowserは、あなたが提案している種類の編集用に設計されていません。しかし、あなたの説明に基づいて、QDomDocument/QDomElementコードがあなたのために働くかもしれません - あなたの入力文書が十分にXMLと互換性があり、DOMクラスによって再び受け入れられ、書き出されるかどうかによって異なります。

また、コアDOMコードには高度なクエリサポートがありません.ID属性をDOMで手動で検索するか、さらに高度なXPath/XQueryサポートを使用する必要があります。

+0

私はちょうどQDomDocumentを使ってみました。それは本当に軽量です。しかし、私が有効なXHTMLとして扱っているHTMLファイルは、各ファイルのかなりの部分が無視されています。 XPath/XQueryがこれを処理できるかどうかはわかりません。さもなければ、私はRegExに落ちなければならないと思います。 –

関連する問題