htmlcxx API用法

时间:2012-07-14 02:35:22

标签: c++ html

我正在使用htmlcxx library来读取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>

除了更改代码之外我还能做什么?

1 个答案:

答案 0 :(得分:7)

此库几乎没有提供任何文档,只有非常的一小组示例代码。树操作从http://tree.phi-sci.com解除,并且该站点有更多文档,但对其他示例代码没有多大帮助。

我见过的每个例子都使用基本的&#34;深度优先&#34; iterator,它允许您使用简单的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()closingText()函数包含了递归处理的子树中包含的任何内容。