tinyxml解析UTF-8字符集的xml

来源:互联网 发布:mac无法拷贝文件到u盘 编辑:程序博客网 时间:2024/05/19 20:59

今天在程序中遇到,当通讯的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,0,TIXML_ENCODING_UTF8);//或者myDocument.Parse(xmlParament,0,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 对转换编码做了很好的介绍


0 0