tinyxml解析UTF-8字符集的xml

今天在程序中遇到,当通讯的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转换编码做了很好的介绍

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念