前几周为实验室处理实验数据,需要将html文件数据转换为xml。在解析html时,在网上搜索了一些解析html的库,发现这个库还是很不错的,其工作原理就是建了一个DOM树。我用的版本是0.85,这篇blog不会说明如何用这个库来编程,而是总结一些使用这个库时需要更改的一些地方,以方便大家使用。

首先这个库使用前需要将其编译成lib,第一次编译应该是通过不了的,需要修改utils.cc文件中的第17行,如图:

0818b9ca8b590ca3270a3433284dd417.png

将变量signature后的等号以及双引号去掉。之后就能够编译通过。

但是这样还是不够的,我处理第一个html的时候还好好的,但是多处理几个之后,发现会报一个错误:_ASSERTE((unsigned)(c + 1) <= 256)。经过各种检查之后,发现是因为碰到了中文的问题,因为中文的ASCII码大于256了,而isspace函数要求传入的参数必须小于256。因此需要找到Node.cc文件中的isspace函数,并进行如下类似修改:

//while (isspace(*begin) && begin < end) ++begin;

while (((unsigned)*begin > 255 || isspace(*begin)) && begin < end) ++begin;

上网查了一些资料,还需要修改一些地方:

还是Node.cc文件,第28行需要进行如下修改:

while (!isspace(*ptr))

{

++ptr;//这种处理方式就断言了:tag名和'>'符号之间一定有空格

}

改成:

while (!isspace(*ptr))

{

if(*ptr == '>')

return;

++ptr;

}

另一处是需要修改ParserSax.tcc文件,注意这个文件在visual studio打开的工程中是看不到的,要在工程文件夹里找,修改如下:

template

_Iterator

htmlcxx::HTML::ParserSax::skipHtmlComment(_Iterator c, _Iterator end)

{

while ( c != end ) {

if (*c++ == '-' && c != end && *c == '-')

{

_Iterator d(c);

while (++c != end &&((unsigned)*c > 255 || !isspace(*c) ) && *c != '>');

if (c == end || *c++ == '>') break;

c = d;

}

}

return c;

}

做完这些后,有时还是会报那个断言错误(好烦啊!)。这是因为ctype.h这个头文件里定义的函数的问题,系统默认编译的时候char是有符号的,也就是范围是-128 —— 127,因此给char类型赋值超过127的时候就会报错。因此我们设置默认char无符号就可以了,但是偏偏vs2010把这个选项去了。没关系,还有办法,在

使用这个库的项目上

右键——属性——配置属性——C/C++——命令行,在下面的其它选项的大块输入框中输入“

/J”。

好了,我们改处理的bug都处理完了,可以使用了。

最后再同一说明一下如何在项目里加lib库。

在项目上右键——属性——配置属性——VC++目录中的“包含目录”中选择所用库的头文件路径,在“库目录中”选择所用库的lib文件路径。

在项目上右键——属性——配置属性——连接器——输入中的“附加依赖项”中输入“htmlcxx.lib”。

这个库据说还很好地处理了一些字符编码问题,不过我使用的时候还没有用过这些功能,以后有机会再学习吧。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐