5

htmlcxx ライブラリを使用してHTML ファイルを読み取り、追加のコンテンツを含む同じ HTML ファイルを生成しています。

問題なくファイルを読み取ることができますが、元の HTML ファイルを出力するだけでは終了タグが正しく含まれません。つまり、単純に DOM 全体を反復して出力すると、終了タグは発行されません。

closingText()ノード用のインターフェースがあることは知っていますが (「参考文献」を参照Node.h)、必要なことを行うための使用方法が見つからないようです。

DOM をダンプする方法は次のとおりです。

it = dom.begin();
end = dom.end();
for (; it != end; ++it)
{
    cout << it->text();
} 

上記は私に与えます:

<div>
    <li>
       <div>
(blank)
(blank)
(blank)
<div>
(blank)

次のhtmlの場合:

<div>
    <li>
        <div>
        </div>
    </li>
</div>
<div>
</div>

コードを変更する以外にできることはありますか?

4

1 に答える 1

7

このライブラリで提供されるドキュメンテーションは事実上なく、サンプル コードの非常に小さなセットのみです。ツリーの操作はhttp://tree.phi-sci.comから削除されました。そのサイトにはもう少しドキュメントがありますが、追加のサンプル コードはあまりありません。

私が見たすべての例では、基本的な「深さ優先」反復子を使用しています。これにより、単純な for ループを使用してツリーをトラバースできます。HTML ツリーをシリアライズするには、実際には再帰を使用する必要があるため、これはあまり役に立ちません。

再帰アルゴリズムが機能するまでハッキングしました。これはライブラリを使用する最良の方法ではないかもしれませんが、うまくいくようです。

void walk_tree( tree<HTML::Node> const & dom )
{
    tree<HTML::Node>::iterator it = dom.begin();
    cout << it->text();
    for ( unsigned i = 0; i < dom.number_of_children(it); i++ )
    {
        walk_tree( dom.child(it, i) );
    }
    cout << it->closingText();
}

私のコードからわかるように、text()andclosingText()関数は、再帰的に処理されるサブツリーに含まれるコンテンツを囲みます。

于 2012-07-14T05:23:37.327 に答える