上面那一篇我们提到了输出Reader->RPCResult->text,如果执行不出错的话,你会发现能得到一个”TRUE”,不管你是MessageBox弹出还是用cout输出,而我们注意下返回的XML中第一个Entity是GetUserProfileResult,类型是boolean,怎么也能输出呢?boolean好像C++里面没有啊?没错,XML里面的元素其实都是字符串文本,而OpenAPI声明中的这些类型是给节点赋值的时候顺带写入的,是为了让服务器识别的,这个问题后面再说,先说说我们怎么获得返回的XML中的除了第一个节点外的值。
Reader->RPCStruct就是一个IXMLDOMNode指针其实,而MSXML中取得节点下的节点用IXMLDOMNode,取得节点列表则用IXMLDOMNodeList接口指针。在返回的GetUserProfileResponse实体下,有GetUserProfileResult和profile是并列的,那么我们就获得一个XML节点的List,0单位肯定就是GetUserProfileResult,1单元就是profile了,而profile下的第一个节点是point,也就是该CSDN ID的专家分。
整理下脉络:
<GetUserProfileResponse xmlns="http://www.csdn.net/">
<GetUserProfileResult>boolean</GetUserProfileResult>
<profile>
<point>int</point>
...
</profile>
</GetUserProfileResponse>
看我们是怎么通过Reader->RPCStruct获得point元素的。代码如下:
// 显示结果
MSXML2::IXMLDOMNode *pXMLNode(NULL);
MSXML2::IXMLDOMNode *pXMLNode2(NULL);
MSXML2::IXMLDOMNodeList *pXMLNodeList(NULL);
BSTR str;
Reader->RPCResult;
//Reader->RPCStruct->get_firstChild(&pXMLNode);
//pXMLNode->get_text(&str);
Reader->RPCStruct->get_childNodes(&pXMLNodeList);
hr = pXMLNodeList->get_item(1, &pXMLNode);//得到profile
pXMLNode->get_firstChild(&pXMLNode2);
pXMLNode2->get_text(&str);
cout<<_com_util::ConvertBSTRToString(str)<<endl;
你可以看到,专家分在命令行中打印出来了,其他我就不再多说了,各位去Google上搜索”MSXML 操作XML”就会非常清楚了我想。Tr0j4n ^_^
在你得到了你所以要的返回值的信息后,你需要释放资源,比如你如果使用了BSTR,那么需要::SysFreeString(&str);
收尾工作:
Reader->Release();
Serializer->Release();
Connector->Release();
CoUninitialize();
仅具有以上的知识还不够应付所有的OpenAPI,下一篇中我们来一起探讨下OpenAPI中的数据类型在C++中的使用和WSDL。