tinyxml解析UTF-8字符集的xml

今天在程序中遇到,当通讯的xml里面含有中文字符的时候,tinyxml解析时总是报错,不能进行解析,查找原因后发现是tinyxml在解析UTF-8字符集的xml时,需要特殊指定字符集才行,下面是对于读取文件和直接解析字符串所需的tinyxml函数的使用方式。

一、需解析的xml



  
    2
    1
    0
    全天侯模板
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
    111111111111111111111111111111111111111111111110
  
  
    2
    2
    0
    工作日模板
    000000000000000000111111111111111110000000000000
    
    000000000000000000111111111111111110000000000000
    
    000000000000000000111111111111111110000000000000
    
    000000000000000000111111111111111110000000000000
    
    000000000000000000111111111111111110000000000000
    
    000000000000000000000000000000000000000000000000
    
    000000000000000000000000000000000000000000000000
  


二、读取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 对转换编码做了很好的介绍


你可能感兴趣的:(C++)