这里举一个简单例子:在简体中文版 Windows 7 平台上,要使用 TinyXML-2 处理一个包含中文字符、UTF-8 编码的 XML 文件,该文件名为 Example.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<material_list>
<circuit_board>电路板&1号</circuit_board>
<supplier>http://amazon.com</supplier>
</material_list>
现在要读取元素节点 circuit_board 中包含的文本节点(其实就是“电路板&1号”),示例程序如下:
/**************************************************
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: April 17th, 2017
* Description: demonstrate how to read XML content
including Chinese characters by using TinyXML-2
**************************************************/
#include "Windows.h"
#include "tinyxml2.h"
#include <iostream>
using namespace std;
int main(void)
{
char file_name[256] = {"Example.xml"};
wchar_t *buffer;
int buffer_len;
tinyxml2::XMLDocument doc;
tinyxml2::XMLText* CircuitBoardTextNode;
_wsetlocale(LC_ALL, L"chs");
doc.LoadFile(file_name);
if ( doc.ErrorID() )
{
wprintf(L"加载配置文件出错!\n");
system("pause");
return (-1);
}
doc.Print();
CircuitBoardTextNode = doc.FirstChildElement("material_list")->FirstChildElement("circuit_board")->FirstChild()->ToText();
const char* CircuitBoardName = CircuitBoardTextNode->Value();
if ( !(buffer_len = MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, NULL, 0)) )
{
wprintf(L"编码转换错误!\n");
system("pause");
return (-1);
}
buffer = new wchar_t[buffer_len];
if ( !(MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, buffer, buffer_len)) )
{
wprintf(L"编码转换错误!\n");
system("pause");
return (-1);
}
wprintf(L"\n%ls\n\n", buffer);
delete [] buffer;
system("pause");
return 0;
}
使用Visual Studio编译并执行这个程序,输出结果如下:
从输出结果可以看出:
1. 使用 TinyXML-2 从 XML 中读取内容时,会将读出的字符串以 char 数组形式存储。在中文版 Windows 操作系统中,使用 tinyxml2::XMLDocument 类的 Print( ) 方法输出 XML 文件的内容时,如果输出内容是可显示的 ASCII 字符,不会有任何问题;如果输出内容是 UTF-8 编码的中文字符,则会显示乱码。
2. 为了能在 Windows 中正确显示 XML 中包含的中文字符,可以使用 Kernel32.dll 中包含的 MultiByteToWideChar( ) 函数,将 UTF-8 编码的中文字符转换为 UTF-16 编码方式的中文字符。在 Windows 中能正确显示 UTF-16 编码的中文字符,不会出现乱码。
3. 使用 tinyxml2::XMLDocument 类的 Print( ) 方法输出 XML 文件中的内容时,Print( ) 方法不会对 XML 规范中定义的转义字符做转换。在本例中,Print( ) 方法被调用后,并未将 & 转换为 & 。
4. 当 tinyxml2::XMLNode::ToText( ) 方法被调用时,会自动处理 XML 规范中定义的转义字符。在本例中,将 & 自动转换为 & ,不需要编程者再做处理。
在文本编辑器 EditPlus 或 Notepad++ 中,能够选择文件编码方式,操作类似于下图:
对于 Example.xml 这个文件,不管以包含 BOM 的 UTF-8 编码方式保存它,还是以不带 BOM 的 UTF-8 编码方式保存它,运行上面的示例程序,发现都能够正常执行。由此可知,对于 UTF-8 编码的 XML 文件中包含或不包含 BOM 这两种情况,TinyXML-2 都能够正确处理。