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

获取相机的设备描述文件.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::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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML文件在Web上显示,需要使用XML解析器和XSLT转换。以下是一些步骤: 1. 将XML文件上传到Web服务器上。 2. 创建一个XSLT文件,用于将XML数据转换为HTML格式。XSLT是一种用于转换XML文档的语言,在浏览器中可以使用JavaScript或者服务器端的XSLT处理器进行转换。 3. 在HTML页面中引入XSLT文件,可以使用<link>标签或者<script>标签。 4. 在HTML页面中使用JavaScript或者服务器端的脚本语言调用XSLT转换XML数据,并将转换后的HTML代码插入到HTML文档中。 以下是一个简单的示例HTML代码: ```html <html> <head> <title>XML文件显示示例</title> <script type="text/javascript"> function loadXMLDoc(filename) { if (window.XMLHttpRequest) { xhttp = new XMLHttpRequest(); } else { xhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET", filename, false); xhttp.send(); return xhttp.responseXML; } function displayResult() { xml = loadXMLDoc("example.xml"); xsl = loadXMLDoc("example.xsl"); if (window.ActiveXObject || xhttp.responseType == "msxml-document") { ex = xml.transformNode(xsl); document.getElementById("example").innerHTML = ex; } else if (document.implementation && document.implementation.createDocument) { xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); resultDocument = xsltProcessor.transformToFragment(xml, document); document.getElementById("example").appendChild(resultDocument); } } </script> </head> <body onload="displayResult()"> <div id="example"></div> </body> </html> ``` 在上面的示例中,我们使用JavaScript和XMLHttpRequest对象来加载XML和XSLT文件,并使用XSLTProcessor对象将XML数据转换为HTML格式。最后,我们将转换后的HTML代码插入到页面中的<div>元素中。 请注意,上述代码只是一个简单的示例,实际情况可能会更加复杂。例如,如果XML文件非常大,我们可能需要使用分页或者异步加载等技术来提高性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值