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 回答