用utf-8编码写入.xml文件,使得msxml可以成功加载xml文件进行解析

来源:互联网 发布:tomcat绑定多个域名 编辑:程序博客网 时间:2024/05/22 05:16

获取相机的设备描述文件.xml之后,需要对它进行解析,获取相关寄存器的信息。

于是利用微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COMComponent Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VBVCDELPHIC++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。

<span style="font-size:18px;"><pre name="code" class="cpp">#include <iostream>using namespace std;#import <msxml4.dll> named_guids using namespace MSXML2;char* filename1 = "eco655MVGE_r2_v1.6.0_b2545.xml";void myExit(){CoUninitialize();}int main(){MSXML2::IXMLDOMDocumentPtrpDoc = NULL;//初始化COMCoInitialize(NULL);//创建解析器实例HRESULT hr = pDoc.CreateInstance(MSXML2::CLSID_DOMDocument);if(FAILED(hr)){cout<<"无法创建DOMDocument对象,请检查是否安装MSXML Parser运行库"<<endl;return EXIT_FAILURE;}//装载XML文档variant_t vResult = pDoc->load(filename1);if((bool)vResult != TRUE){cout<<"装载XML文件失败"<<endl;return EXIT_FAILURE;}        //对XML文件解析的部分        pDoc = NULL;        atexit(myExit);          return EXIT_SUCCESS;      }</span>


测试报错,装载文件失败。

于是用记事本打开.xml文件,选择编码utf-8另存为,发现load成功了。

于是就思考是否能在程序中,获取数据写入.xml文件的时候,就保存为UTF-8的xml文件

原始数据为char * buffer,数据长度int len,

bool WriteToXMLfile(const char * filename,char * buffer,DWORD len){string s = buffer;wstring text = ANSIToUnicode(s);std::string outtext = UnicodeToUTF8(text);ofstream file(filename);//if(!file.good())//return false;file.seekp(0,ios::beg);file.write(outtext.data(),outtext.size());file.close();return true;}


1、将ASCI转换成Unicode

<span style="font-size:18px;">wstring ANSIToUnicode(const string &str){int len = 0;len = str.length();int unicodeLen = ::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,NULL, 0 ); wchar_t * pUnicode; pUnicode = new  wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar( CP_ACP,0,str.c_str(),-1,(LPWSTR)pUnicode,unicodeLen ); wstring rt; rt = ( wchar_t* )pUnicode;delete pUnicode; return rt; }</span>

2、将Unicode转换成Utf-8

<span style="font-size:18px;">std::string UnicodeToUTF8(const std::wstring& wstr){char *pText; int iTextLen; iTextLen = WideCharToMultiByte(CP_UTF8, 0,wstr.c_str(),-1,NULL,0,NULL,NULL);pText = new char[iTextLen+1];memset((void*)pText,0,sizeof(char)*(iTextLen+1));WideCharToMultiByte(CP_UTF8,0,wstr.c_str(),-1,pText,iTextLen,NULL,NULL);string str = pText;delete[] pText;return str;}</span>


参考文章:http://www.cnblogs.com/qq78292959/archive/2010/09/15/2077015.html


0 0
原创粉丝点击