获取相机的设备描述文件.xml之后,需要对它进行解析,获取相关寄存器的信息。
于是利用微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++ 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::IXMLDOMDocumentPtr pDoc = NULL;
//初始化COM
CoInitialize(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