VC 读取xml文件-load函数返-1的错误

VC 读取xml文件--load函数返-1的异常
本帖最后由 qq2399431200 于 2013-12-25 16:22:38 编辑
在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等开源的库,感觉轻量级。