关于tinyxml使用的文档有很多(这篇文章就写的很好),这里仅提一下字符编码的转换问题,如果你不熟悉字符编码最好先阅读一下计算机内存和文件中的UNICODE字符.
- TiXmlDocument* m_pTinXMLDoc = new TiXmlDocument;
- TiXmlDeclaration* pdecl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
- m_pTinXMLDoc->LinkEndChild(pdecl); // <?xml version="1.0" encoding="UTF-8"?>
- // <TransmitInfo datetime="2012-10-10 19:10:23" cmd="1" category="">
- TiXmlElement* pEleRoot = new TiXmlElement("RootNode");
- pEleRoot->SetAttribute("id", "这是中文");
- TiXmlElement* pNode = new TiXmlElement("中文标签");
pNode->SetAttribute("中文属性", "属性值");- pEleRoot->LinkEndChild(pNode);
- m_pTinXMLDoc->LinkEndChild(pEleRoot);
- m_pTinXMLDoc->SaveFile("e:\\testansi.xml");
文件内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<RootNode id="这是中文">
<中文标签 中文属性="属性值" />
</RootNode>
上面代码需要注意一个调用:new TiXmlDeclaration("1.0", "UTF-8", "yes");参数"UTF-8"不是设置内存中xml文件的编码方式,而仅仅是这只文件头encoding的属性,跟文件实际编码方式无关.不过这样做还是意义的,可以获取文件内容字符串,然后转换为utf-8格式,在网络上传输.如下代码:
- TiXmlPrinter printer;
- m_pTinXMLDoc->Accept(&printer);
- int nxmlBytes = printer.Size();
- const char* xmlcstr = printer.CStr();
- ASSERT(strlen(xmlcstr)==nxmlBytes && nxmlBytes<nLen);
- //将xmlcstr转换为utf-8
- //...略.
转换之后,encoding=UTF-8真正表示文件的编码格式.
另外,调用SaveFile保存到本地时,仍然是以ANSI字符格式保存到本地.
所以,实际上xml文件头中的属性encoding=UTF-8,但文件未必是UTF-8编码方式.