pugixml 是一个非常好用的c++ xml解析库,速度快,占用内存小,支持xpath,且开源,可以说是c++ xml解析库的首选.
但近日发现,使用pugixml解析xml.然后再将其保存成xml文件的时候,会造成空格丢失的情况.经过一番跟踪调试,终于发现问题所在,遂在此记录.
在pugixml读入buffer进行解析的时候,在pugixml.cpp的第3406行(pugixml1.7) 有这么一行代码
PUGI__SKipWS(); // Eat whitespace if no genuine PCDATA here.
该行代码是一个宏,对应的是
#define PUGI__SKIPWS() { while (PUGI__IS_CHARTYPE(*s, ct_space)) ++s; }
其中 PUGI__IS_CHARTYPE 是一个检查是不是该字节是不是对应的类型,
ct_space是chartype_t的一个类型,chartype_t的全部内容如下
enum chartype_t{ct_parse_pcdata = 1,// /0, &, /r, <ct_parse_attr = 2,// /0, &, /r, ', "ct_parse_attr_ws = 4,// /0, &, /r, ', ", /n, tabct_space = 8, // /r, /n, space, tabct_parse_cdata = 16,// /0, ], >, /rct_parse_comment = 32,// /0, -, >, /rct_symbol = 64,// Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .ct_start_symbol = 128// Any symbol > 127, a-z, A-Z, _, :};
从这里我们就可以看到了,如果是/r, /n, space, tab的话 pugixml是会自动跳过的
全文使用PUGI__SKIPWS的有六个地方,经过本人的测试,没有深究其中的代码,注释上文所说的地方就可以在不影响功能(不影响我使用到的功能,可能有影响到的我没碰到)的情况下保留正文中的空格.
新闻热点
疑难解答