xml很简单,定义:
<root>
<msg>
<title>网站1</title>
<url>www.263.net</url>
<time>13</time>
</msg>
<msg>
<title>网站2</title>
<url>www.csdn.net</url>
<time>24</time>
</msg>
......
</root> 我需要把里面的数据依次都取出来。
下面的代码我是从CSDN上看的,然后自己改的,可是现在编译错误:
error C2872: 'DOMNodeType' : ambiguous symbol
error C2664: 'get_attributes' : cannot convert parameter 1 from 'struct MSXML2::IXMLDOMNode ** ' to 'struct MSXML2::IXMLDOMNamedNodeMap ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast代码如下:
#import "msxml3.dll" 
#include "msxml2.h"using namespace MSXML2;
int searchXML(char *xmlstring)
{
CoInitialize(NULL); 
try {  
IXMLDOMDocumentPtr spXMLDOM;
HRESULT hr = spXMLDOM.CreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) { throw "Can't create XML Parser Object!"; return -1;  }
         // 如果对象创建成功的话,就开始装载XML文档

hr = spXMLDOM->loadXML(_bstr_t(xmlstring));
if ( FAILED(hr) ) { throw "Don't Understand Error!"; return -1;  }   

IXMLDOMElementPtr childNode;
childNode = (IXMLDOMElementPtr)(spXMLDOM->selectSingleNode("//msg"));

DOMNodeType nodeType;
childNode->get_nodeType(&nodeType); BSTR var;
CString name;
var = childNode->GetnodeName();
name = (char*)(_bstr_t)var;
VARIANT varval;
varval = childNode->GetnodeTypedValue();
CString strValue = (char*)(_bstr_t)varval; IXMLDOMNamedNodeMapPtr pAttrs = NULL;
IXMLDOMNodePtr pAttrItem;
childNode->get_attributes(&pAttrItem);

long lCounts;
pAttrs->get_length(&lCounts);
for (int i=0; i<lCounts; i++)
{
pAttrs->get_item(i, &pAttrItem);
}
}
catch(char* lpstrErr)
{
printf(lpstrErr);
CoUninitialize();
}
catch(...)
{
printf("***************程序出现异常!!!***************");
CoUninitialize();
} CoUninitialize();
}对COM不熟,可是现在要用到了 :( 
希望能得到大家的帮助,小弟多谢!!

解决方案 »

  1.   

    MSXML2::IXMLDOMNamedNodeMapPtr pAttrsTmp = NULL; 
    childNode->get_attributes(&pAttrsTmp);你参数类型定义错了
      

  2.   

    多谢snake1122,解决了。可是现在还有一个错误error C2872: 'DOMNodeType' : ambiguous symbol这个是什么问题呢?
      

  3.   

    好了,我在前面加了MSXML2::DOMNodeType。运行的时候,下面出现了异常,调用的有问题吗?
    hr = spXMLDOM->loadXML(_bstr_t(xmlstring));
    我看别的地方都是load一个xml文件,我这里是一个char *,这样可以吗?
      

  4.   

    我这么用可以
    _variant_t varXml(strXmlName);
    _variant_t varOut((bool)TRUE);
    varOut = docPtr->load(varXml);strXmlName就是文件路径名比如“d:\\xmltest.xml”
      

  5.   

    我的意思是,我现在不是从xml文件里面读,而是从网络上取得的,已经是char*字符串了。
    这样该怎么办呢?还是谢谢您又给我回复 :)
      

  6.   

    可以把char*字符串直接赋值给_bstr_t 类型的变量,再传给loadXML函数就没问题了