今天在程序中遇到,当通讯的xml里面含有中文字符的时候,tinyxml解析时总是报错,不能进行解析,查找原因后发现是tinyxml在解析UTF-8字符集的xml时,需要特殊指定字符集才行,下面是对于读取文件和直接解析字符串所需的tinyxml函数的使用方式。
一、需解析的xml
<?xml version="1.0" encoding="utf-8"?> <Parament> <SchedTempl> <CommandType>2</CommandType> <SchedTemplID>1</SchedTemplID> <SchedType>0</SchedType> <SchedName>全天侯模板</SchedName> <MondaySched>111111111111111111111111111111111111111111111110</MondaySched> <TuesdaySched>111111111111111111111111111111111111111111111110</TuesdaySched> <WednesdaySched>111111111111111111111111111111111111111111111110</WednesdaySched> <ThursdaySched>111111111111111111111111111111111111111111111110</ThursdaySched> <FridaySched>111111111111111111111111111111111111111111111110</FridaySched> <SaturdaySched>111111111111111111111111111111111111111111111110</SaturdaySched> <SundaySched>111111111111111111111111111111111111111111111110</SundaySched> </SchedTempl> <SchedTempl> <CommandType>2</CommandType> <SchedTemplID>2</SchedTemplID> <SchedType>0</SchedType> <SchedName>工作日模板</SchedName> <MondaySched>000000000000000000111111111111111110000000000000</MondaySched> <TuesdaySched> 000000000000000000111111111111111110000000000000</TuesdaySched> <WednesdaySched> 000000000000000000111111111111111110000000000000</WednesdaySched> <ThursdaySched> 000000000000000000111111111111111110000000000000</ThursdaySched> <FridaySched> 000000000000000000111111111111111110000000000000</FridaySched> <SaturdaySched> 000000000000000000000000000000000000000000000000</SaturdaySched> <SundaySched> 000000000000000000000000000000000000000000000000</SundaySched> </SchedTempl> </Parament>
二、读取xml文件,tinyxml处理方式
TiXmlDocument *xmlfile= new TiXmlDocument(FilePath); xmlfile->LoadFile(TIXML_ENCODING_UTF8);
三、读取xml字符串,tinyxml处理方式
TiXmlDocument myDocument; myDocument.Parse(xmlParament,TIXML_ENCODING_UTF8); //或者myDocument.Parse(xmlParament,TIXML_ENCODING_LEGACY); if( !myDocument.Error() ){ TiXmlElement* paramentEle = myDocument.FirstChildElement(PARAMENT_PARENT_NODE_NAME); if (paramentEle==NULL) { return FALSE; } TiXmlElement* schedTemplEle = paramentEle->FirstChildElement("SchedTempl"); while(schedTemplEle) { RecordScheduleTemplateInfo templInfo; TIXML_NODE_VALUE_FROM_PARENT(schedTemplEle,"SchedTemplID",&templInfo.schedTemplId); TIXML_NODE_VALUE_FROM_PARENT(schedTemplEle,"SchedType",&templInfo.schedType); templInfo.schedName = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"SchedName",""); templInfo.mondaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"MondaySched",""); templInfo.tuesdaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"TuesdaySched",""); templInfo.wednesdaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"WednesdaySched",""); templInfo.thursdaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"ThursdaySched",""); templInfo.fridaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"FridaySched",""); templInfo.saturdaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"SaturdaySched",""); templInfo.sundaySched = TIXML_NODE_TEXT_FROM_PARENT(schedTemplEle,"SundaySched",""); this->schedTemplInfoList.push_back(templInfo); schedTemplEle = schedTemplEle->NextSiblingElement(); } }
说明(引用官方的翻译)
一般地,TinyXML 试着检测正确的编码方式并使用它。但是,可以通过在头文件中设置 TIXML_DEFAULT_ENCODING 的值来强制使用某一种编码方式。
TinyXML 将要假设一种合法模式,直到一下的其中之一发生:
1)如果不是标准的,但是 UTF-8 带头字节(UTF-8 lead bytes)出现在文件或数据流的头部,TinyXML 将按照 UTF-8 的编码方式读取。
2)如果声明的标签被读取,并且它有个 encoding="UTF-8",则按照 UTF-8 编码方式读取。
3)如果声明的标签被读取,它没有特殊的编码,则按照 UTF-8 编码。
4)如果声明表中是 encoding="something else",TinyXML 将其读作为合法模式(legacy mode)。在合法模式中,TinyXML 和以前工作一样。不清楚具体是哪种模式,老的内容应该保持工作。
5)直到上面的一种准则满足,TinyXML 按照合法模式执行。
如果编码是不正确的,或者被检测出来将要发生什么?TinyXML 将其看做不合适的编码。你可能得到的是不正确的结果或乱码。你可能想强制 TinyXML 变为正确的模式。
这一通过 LoadFile( TIXML_ENCODING_LEGACY ) 或者 LoadFile( filename,TIXML_ENCODING_LEGACY ) 的方式强制 TinyXML 设置为合法模式。你可以设置 TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY 来一直使用合法模式。同样地,你也可以使用同样的技术将其设置为 TIXML_ENCODING_UTF8。
对于英语用户,使用英文的 XML,UTF-8 与 low-ASCII 是一样的,你不需要检测 UTF-8 或者改变你的代码。可以将 UTF-8 看做 ASCII 的一个超集。
UTF-8 不是双字节格式,但是它是 Unicode 的标准编码。
TinyXML 不使用和直接同时支持 wchar,TCHAR,或者 微软的 _UNICODE。
用 Unicode 指代 UTF-16 是不合适的,UTF-16 是 Unicode 的一种宽字节编码方式。这引起了混乱。
对于 high-ascii 语言,TinyXML 可以处理所有的语言,同时,只要 XML 被编码成 UTF-8。这样有些滑稽,老的程序员和操作系统趋向于使用 default 和 traditional 的代码页。许多应用可以输出 UTF-8,但是老或者顽固的应用是以默认的代码页输出文本的。
http://skew.org/xml/tutorial 对转换编码做了很好的介绍