Frage htmlcxx API-Nutzung


Ich benutze die htmlcxx Bibliothek eine HTML-Datei lesen und dieselbe HTML-Datei mit zusätzlichem Inhalt generieren.

Ich kann die Datei ohne Probleme lesen, aber die ursprüngliche HTML-Datei emittiert die End-Tags nicht korrekt. Das heißt, wenn ich einfach das gesamte DOM iteriere und ausspreche, werden keine schließenden Tags ausgegeben.

Ich weiß, dass es ein closingText() Schnittstelle für einen Knoten (siehe Node.h), aber ich kann keinen Weg finden, es zu benutzen, der mich tun lässt, was ich brauche.

Hier ist, wie ich das DOM dumping bin:

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

Das obige gibt mir:

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

für den folgenden HTML:

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

Was kann ich tun, außer den Code zu ändern?


5
2017-07-14 02:35


Ursprung


Antworten:


Mit dieser Bibliothek wird praktisch keine Dokumentation bereitgestellt und nur ein sehr kleiner Satz Beispielcode. Die Baummanipulation wurde aufgehoben http://tree.phi-sci.com und diese Seite hat etwas mehr Dokumentation, aber nicht viel zusätzlichen Code.

Jedes Beispiel, das ich gesehen habe, verwendet den grundlegenden Iterator "depth-first", mit dem Sie den Baum mit einer einfachen for-Schleife durchlaufen können. Dies scheint nicht sehr nützlich zu sein, denn um einen HTML-Baum zu serialisieren, müssen Sie wirklich Rekursion verwenden.

Ich habe gehackt, bis ich einen rekursiven Algorithmus funktionierte. Dies ist möglicherweise nicht der beste Weg, um die Bibliothek zu verwenden, aber es scheint zu funktionieren.

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();
}

Wie Sie aus meinem Code entnehmen können, ist der text() und closingText() Funktionen umschließen den Inhalt, der in dem Unterbaum enthalten ist, der rekursiv verarbeitet wird.


7
2017-07-14 05:23