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的有六個地方,經過本人的測試,沒有深究其中的代碼,注釋上文所說的地方就可以在不影響功能(不影響我使用到的功能,可能有影響到的我沒碰到)的情況下保留正文中的空格.
新聞熱點
疑難解答