pugixml 丢失空格的解决方法

来源:互联网 发布:淘宝服装图标 编辑:程序博客网 时间:2024/06/05 10:04

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, tab
ct_space = 8, // \r, \n, space, tab
ct_parse_cdata = 16,// \0, ], >, \r
ct_parse_comment = 32,// \0, -, >, \r
ct_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的有六个地方,经过本人的测试,没有深究其中的代码,注释上文所说的地方就可以在不影响功能(不影响我使用到的功能,可能有影响到的我没碰到)的情况下保留正文中的空格.

0 0