读书人

LoadXML加载出错解决思路

发布时间: 2012-01-16 23:36:51 作者: rapoo

LoadXML加载出错
我想加载一串XML文档。我的XML文档是从一文件中读出来的。文件格式是UTF-8,我首先将其转为Unicode格式,然后存入一CString类型中。代码如下:
CString filters; // 用来过滤的字符串
filters.Format(_T("%s"),_T("XML(*.xml)|*.XML||")) ;
//用系统内部的对话框打开文件,TRUE为OPEN对话框,FALSE为SAVE AS对话框
CFileDialog dlg(TRUE,_T("XML"),_T("1019GX.XML"),OFN_READONLY,filters, this);
if (dlg.DoModal() == IDOK) // 文件打开对话框
{
CString path = dlg.GetPathName();
CString data;
CFile f;
f.Open(path,CFile::modeRead|CFile::typeBinary,0); // 从文件中读取字符
UINT size = f.GetLength();

BYTE* buf = new BYTE[size];
f.Read(buf,size);
f.Close();
DWORD dwNum = MultiByteToWideChar (CP_UTF8, 0, (LPCSTR)buf, -1, NULL, 0);
TCHAR *pwText;
pwText = new TCHAR[dwNum];


MultiByteToWideChar (CP_UTF8, 0, (LPCSTR)buf, -1,pwText, size); // 将字符转为Unicode型

data=CString(pwText);
data.Trim();
if (pwText!= NULL)
{
delete[] pwText;
pwText = NULL;
}
if (buf!= NULL)
{
delete[] buf;
buf = NULL;
}
m_richText.SetDataXml(data); // 将数据传入m_richText类的data中
m_richText.Reader(); // 调用m_richText中的解析方法
}

而后开始解析:// m_pDom是DOM中的document对象,其初始化过程省略(初始化正确)
void XWRichText::Reader()

VARIANT_BOOL vResult;
vResult = m_pDom->loadXML(data.AllocSysString());
//这一步,vResult总是返回0,表示加载没成功。

}
我查过data里面的内容,并将里面的内容复制下来,存入一XML文档中,用浏览器打开,浏览器能正确解析。可是在这里总是返回错误,我试了好多遍,总是不行,求哪位知道的同志帮忙解答下,不胜感激!




[解决办法]
有两种可能性:
1.m_pcom的创建有问题。但是我想这种问题是比较简单的,应该LZ就可以看出来。
2.还有一种就是字符编码的问题,我看了一下你的代码,我想存在一种可能性会导致加载失败,比如说你的xml字符串存的文件是utf-8的文件格式,这种文件开始是以efbbbf三个字节开始的,你可以用记事本打开然后另存为看一下文件的格式是否是utf-8,如果是utf-8的话,那么你读取文件的时候,就不能把这三个字节读出来了。要从3开始读,读取的长度是length - 3.这样才能保证xml是合法的。。LZ可以调试的时候看一下,内存前三个字节是否是efbbbf..

读书人网 >VC/MFC

热点推荐