MFC中怎么打开一个XML文件并将内容写入编辑框

saintdemon 2015-07-21 06:00:45
新手刚接触mfc,用tinyxml在做。
...全文
1969 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwugang 2016-04-27
  • 打赏
  • 举报
回复
看不懂 啊,求详解
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
报什么错,贴上来
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
引用 6 楼 pcradio 的回复:
你的工程是Unicode编码的,所以传入编辑框的字符串必须是Unidoe的wchar_t* 而tinyxml解析出来的要么是utf-8要么是ANSI要么是GB2312 GBK等。。。你先确定你的xml的内容是什么编码的,如果你用记事本 创建的xml,通常内容是多自己编码的,你试试这么转码:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
        UINT nCodePage = 936; //GB2312
        int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
        wchar_t* pBuffer = new wchar_t[nLength+1];
        MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
        pBuffer[nLength]=0;
        return pBuffer;
}
把strXml传入,把GB2312ToUnicode返回的指针传入SetDlgItemText(nID, lpszString)的lpszString
这样会报错,强转也用不了。
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
引用 7 楼 saintdemon 的回复:
[quote=引用 6 楼 pcradio 的回复:] 你的工程是Unicode编码的,所以传入编辑框的字符串必须是Unidoe的wchar_t* 而tinyxml解析出来的要么是utf-8要么是ANSI要么是GB2312 GBK等。。。你先确定你的xml的内容是什么编码的,如果你用记事本 创建的xml,通常内容是多自己编码的,你试试这么转码:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
        UINT nCodePage = 936; //GB2312
        int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
        wchar_t* pBuffer = new wchar_t[nLength+1];
        MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
        pBuffer[nLength]=0;
        return pBuffer;
}
把strXml传入,把GB2312ToUnicode返回的指针传入SetDlgItemText(nID, lpszString)的lpszString
看了下大部分是utf-8的,这样可以运行了,但是输出的没有换行。
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
char* CNodeSystemApp::CStringWToAnsi(CStringW& str)
{
	LPCWSTR pWcs = (LPCWSTR)str;
	int strlen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pWcs, -1, NULL, 0, NULL, NULL);
	char* strAnsi = new char[strlen + 1];
	memset(strAnsi, 0, strlen + 1);
	WideCharToMultiByte (CP_ACP, 0, (LPWSTR)pWcs, -1, strAnsi, strlen, NULL, NULL);
	return strAnsi;
}
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
Unicode工程的GetPathName的CString是Unicode编码的,需将其转为多字节编码才可用于tinyxml写文件:
char* CStringWToAnsi(CStringW& str)
{
	LPCWSTR pWcs = (LPCWSTR)str;
	int strlen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pWcs, -1, NULL, 0, NULL, NULL);
	char* strAnsi = new char[strlen + 1];
	memset(strAnsi, 0, strlen + 1);
	WideCharToMultiByte (CP_ACP, 0, (LPWSTR)pWcs, -1, strAnsi, strlen, NULL, NULL);
	retu
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
引用 15 楼 pcradio 的回复:
具体你的问题代码在你手里,你要自己打断点调试,以后回复请“引用”不然没法看到你的回复
GetPathName得到的路径是CString,强转的话值会乱码,如何用于TiXMLDocument()?
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
具体你的问题代码在你手里,你要自己打断点调试,以后回复请“引用”不然没法看到你的回复
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
我前面的控件放错了。现在可以运行了,但是无法输出内容。是获取路径载入文件那里出问题了吗?
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
只要你doc对象不是new的,不存在内存泄漏问题,如果new了,记得delete pDoc;
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
引用 11 楼 saintdemon 的回复:
编译可以通过了,但是提示内存泄露。还不会用Tinyxml释放缓存,怎么处理?
tinyxml 的Doc对象声明成局部变量,节点全部使用指针,不用你去delete,它自己内部维护了一个链表,doc析构自动delete
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
编译可以通过了,但是提示内存泄露。还不会用Tinyxml释放缓存,怎么处理?
阿源是少年 2015-07-22
  • 打赏
  • 举报
回复
重定义了,把wchar_t* GB2312ToUnicode(const char* szGBString) { UINT nCodePage = 936; //GB2312 int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0); wchar_t* pBuffer = new wchar_t[nLength+1]; MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength); pBuffer[nLength]=0; return pBuffer; }放到cpp里,勿放入.h
saintdemon 2015-07-22
  • 打赏
  • 举报
回复
error LNK2005: "wchar_t * __cdecl GB2312ToUnicode(char const *)" (?GB2312ToUnicode@@YAPA_WPBD@Z) already defined in xml 7.8.obj
阿源是少年 2015-07-21
  • 打赏
  • 举报
回复
你的工程是Unicode编码的,所以传入编辑框的字符串必须是Unidoe的wchar_t* 而tinyxml解析出来的要么是utf-8要么是ANSI要么是GB2312 GBK等。。。你先确定你的xml的内容是什么编码的,如果你用记事本 创建的xml,通常内容是多自己编码的,你试试这么转码:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
        UINT nCodePage = 936; //GB2312
        int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
        wchar_t* pBuffer = new wchar_t[nLength+1];
        MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
        pBuffer[nLength]=0;
        return pBuffer;
}
把strXml传入,把GB2312ToUnicode返回的指针传入SetDlgItemText(nID, lpszString)的lpszString
saintdemon 2015-07-21
  • 打赏
  • 举报
回复
引用 4 楼 pcradio 的回复:
xmltext是std::cstring的,不能直接转LPCSTR 还有,tinyxml貌似不支持unicode,你拿到的值都是ANSI编码的,不能赋值给wchar_t变量
LPCSTR strXML = xmltext.c_str();
转为LPCSTR在后面输出到编辑框的时候还是需要LPCTSTR,还是会报错。 请问如何解决?
阿源是少年 2015-07-21
  • 打赏
  • 举报
回复
xmltext是std::cstring的,不能直接转LPCSTR 还有,tinyxml貌似不支持unicode,你拿到的值都是ANSI编码的,不能赋值给wchar_t变量
LPCSTR strXML = xmltext.c_str();
saintdemon 2015-07-21
  • 打赏
  • 举报
回复
引用 2 楼 pcradio 的回复:
字串通过tinyxml解析出来之后通过
void SetDlgItemText( int nID, LPCTSTR lpszString );
设置编辑框的值,nID是编辑框的ID
CString path = fDlg.GetPathName(); const char * xml = (LPSTR)(LPCTSTR)path; TiXmlDocument doc(xml); doc.LoadFile(); TiXmlPrinter printer; doc.Accept(&printer); std::string xmltext = printer.CStr(); LPCTSTR strXML = (LPCTSTR)xmltext; //这里的转换会报错 SetDlgItemText(IDC_EDIT2,strXML); 请问这样如何修改?
阿源是少年 2015-07-21
  • 打赏
  • 举报
回复
字串通过tinyxml解析出来之后通过
void SetDlgItemText( int nID, LPCTSTR lpszString );
设置编辑框的值,nID是编辑框的ID
saintdemon 2015-07-21
  • 打赏
  • 举报
回复
如果要把输出的内容效果做成IE打开的那样,是不是要用RichEdit?

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧