VC 读取xml文件-load函数返-1的错误
VC 读取xml文件--load函数返-1的异常
在MFC中读取xml配置文件时,代码中“注释1”处的返回值一直为-1。不知道是什么原因,请大家帮忙解决下这个问题。请大家针对这个问题帮助我,建议我使用别的库函数(比如:Boost的property_ptree)来操作xml文件的大牛尽量帮我解决这个问题,谢谢。
异常的语句:
HRESULT loadrs = pDoc->load("G:\\XML读写\\OperateXML\\test.xml");
//注释1:一直有异常,loadrs的值为-1
if( S_OK != loadrs )
MessageBox("加载XML错误");
xml文件的内容如下:
VC中读取操作代码:
------解决方案--------------------
-1就是成功的返回值呐,msdn中
Return Value
Boolean. Returns True if the load succeeded; False if the load failed.
load函数的返回值为VARIANT_BOOL,查看定义
------解决方案--------------------
你#import msxml dll 后 vs 会自动封装那个com组件的接口
原来的load确实返回hresult;但封装后会返回variant_bool
右击那个函数 转到定义会看到
------解决方案--------------------
raw_load是个纯虚函数,应该由IXMLDOMDocument的派生类来实现。如果找不到,估计是微软封装起来了。
微软的组件或是库,核心一般都不会开源的吧。还是喜欢TinyXml等开源的库,感觉轻量级。
在MFC中读取xml配置文件时,代码中“注释1”处的返回值一直为-1。不知道是什么原因,请大家帮忙解决下这个问题。请大家针对这个问题帮助我,建议我使用别的库函数(比如:Boost的property_ptree)来操作xml文件的大牛尽量帮我解决这个问题,谢谢。
异常的语句:
HRESULT loadrs = pDoc->load("G:\\XML读写\\OperateXML\\test.xml");
//注释1:一直有异常,loadrs的值为-1
if( S_OK != loadrs )
MessageBox("加载XML错误");
xml文件的内容如下:
<China>
<City population="7000" area="2000">shanghai</City>
<City population="39999" area="3322">beijing</City>
</China>
VC中读取操作代码:
#import "C:\\WINDOWS\\system32\\msxml3.dll"
using namespace MSXML2;
void COperateXMLDlg::OnBtnGetXML()
{
m_list.DeleteAllItems(); //m_list是ListControl控件绑定的一个变量
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
MessageBox("Error!");
return;
}
HRESULT loadrs = pDoc->load("G:\\XML读写\\OperateXML\\test.xml");
//注释1:一直有异常,loadrs的值为-1,但是其后的代码没有问题,数据读取也正常
if( S_OK != loadrs )
MessageBox("加载XML错误");
MSXML2::IXMLDOMElementPtr childNode;
childNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode("//City"));
//查询字串中的“//”表示所有行查找
MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType);
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodeListPtr nodeList;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrs);
childNode->get_childNodes(&nodeList);
long nCount, iCount;
pAttrs->get_length(&nCount); //获取节点属性个数
nodeList->get_length(&iCount); //获取节点个数
for(int i = 0; i < iCount; i++) //根据需要可以添加数据到ListControl中
{
for(int j = 0; j < nCount; j++)
{
pAttrs->get_item(j, &pAttrItem);
CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
m_list.InsertItem(i, strAttrName);
m_list.SetItemText(i, 1, strAttrValue);
}
}
}
------解决方案--------------------
-1就是成功的返回值呐,msdn中
Return Value
Boolean. Returns True if the load succeeded; False if the load failed.
load函数的返回值为VARIANT_BOOL,查看定义
/* 0 == FALSE, -1 == TRUE */
typedef short VARIANT_BOOL;
------解决方案--------------------
你#import msxml dll 后 vs 会自动封装那个com组件的接口
原来的load确实返回hresult;但封装后会返回variant_bool
右击那个函数 转到定义会看到
inline VARIANT_BOOL IXMLDOMDocument::load ( const _variant_t & xmlSource ) {
VARIANT_BOOL _result = 0;
HRESULT _hr = raw_load(xmlSource, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}
------解决方案--------------------
raw_load是个纯虚函数,应该由IXMLDOMDocument的派生类来实现。如果找不到,估计是微软封装起来了。
微软的组件或是库,核心一般都不会开源的吧。还是喜欢TinyXml等开源的库,感觉轻量级。