请问:如何在VC7的 mfc工程中,用msxml4.dll来实现写xml文件中结点的属性呀?
   我试着用IXMLDOMElementPtr的setAttribute(),可因其建结点时,都用的是IXMLDOMNodePtr,没办法将IXMLDOMElementPtr加到IXMLDOMNodePtr中去。
   不知关于IXMLDOMElementPtr与IXMLDOMNodePtr的区别在于什么,它们如何转换呀?
请教各位哪儿有关于它们的详细介绍呀,我在MFC的工程中用msxml4.dll的sdk help,发现它们都是控制台的工程上写的,在VC7的MFC上写会遇到许多莫名其妙的错误。
   如,
   1。我用下面的语句试着将IXMLDOMNodePtr转成IXMLDOMElementPtr的,在一个函数下可以成功,而换个函数就不行了,总是反回为空。
    pElement = static_cast<MSXML2::IXMLDOMElementPtr> (pNode);
   2。我在工程中加了
     #import "msxml4.dll"
     using namespace MSXML2;
         再将
     MSXML2::IXMLDOMNodePtr pParentNode
    改成
     IXMLDOMNodePtr pParentNode
    再编译就会出错说
     error C2872: 'IXMLDOMNodePtr' : ambiguous symbol
   真是让人一头雾水。
   不知各位是否也碰到这样的情况,请各位大侠不吝赐教呀,在此先多谢了。
 
 
    

解决方案 »

  1.   

    http://vcer.net/showTip.jsp?tipid=2248
      

  2.   

    楼上贴的链接好像没有答案吧.我也找这个问题很久了。上次发了贴也没人回。就是智能指针的问题。在vc6下正常使用的IXMLDOMDocumentPtr IXMLDOMNodePtr等智能指针到了vc7下编译。就提示 ambiguous symbol。不知道怎么搞了。vc7应该不会只让用原始的IXMLDOMDocument IXMLDOMNode吧。跟lz一起问:vc7怎么才能用智能指针???
      

  3.   

    写属性可以把IXMLDOMNodePtr强制转换一个IXMLDOMElementPtr如:
    <outline expanded="1"></outline>IXMLDOMNodePtr pOutlineNode = NULL;
    IXMLDOMElementPtr spExpanded = NULL;pOutlineNode = theXml->selectSingleNode("/outline");
    spExpanded = pOutlineNode;spExpanded->setAttribute("expanded", "0");至于区别据我个人愚见IXMLDOMElement应该表示一个xml元素.
    比如outline,它可以有若干属性
    IXMLDOMNode表示更广义的节点,data types, namespaces, document type definitions (DTDs), and schemas
    当然只是个人体会。我不是高手,要不也不会有问题了:<
      

  4.   

    >ambiguous symbol
    don't import to the default namespace
      

  5.   

    我看许多资料上说IXMLDomElement是从IXMLDomNode派生来的,理论上是可以直接转的,可它们之间加了个ptr,就不知道是怎么回事了,变得很混乱。特别当IXMLDOMNodePtr当参数在函数中传的时候,常会导致莫名的异常错误,这要怎么解呀?
      

  6.   

    直接用
    pElement = spNode;就可以
      

  7.   

    不可以直接转,因为COM里面没有派生这回事。查询COM接口只能用QueryInterface。IXMLDOMNodePtr是从_com_ptr派生出来的,_com_ptr自动化了很多操作,例如QueryInterface、AddRef和Release
      

  8.   

    IXMLDOMNodePtr似乎重载了类似智能指针的功能,应该可以直接用
      

  9.   

    #import "msxml4.dll"
         using namespace MSXML2;
             再将
         MSXML2::IXMLDOMNodePtr pParentNode
        改成
         IXMLDOMNodePtr pParentNode
    -----------------------
    你明明说要用XML的名字空间了,却把MSXML2::IXMLDOMNodePtr pParentNode改成IXMLDOMNodePtr pParentNode
    当然就认不出IXMLDOMNodePtr是什么东东了
      

  10.   

    to gzlyb:
       不是很明白你说的意思, using namespace MSXML2;不是整体声明的MSXML2的名字空间吗?怎么还需要在单个使用时再声明一次呢?
      

  11.   

    好了,关于取函数,从node可以直接转成element了,是因我程序写有点问题,谢谢大家了。