您的位置:首页 > 其它

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

2015-12-29 15:36 471 查看
获取相机的设备描述文件.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>


参考文章:/article/4656699.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: