程序中已明确声明了--using namespace MSXML2;但编译时还是告知--error C2872: “IXMLDOMDocumentPtr” : 不明确的符号, 。只有在定义每个变量,明确在声明才可以--如下:
MSXML2::IXMLDOMDocumentPtr docPtr;
MSXML2::IXMLDOMNodePtr DOMNodePtr;
MSXML2::IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;为什么?命名空间已经声明,为什么还提示“IXMLDOMDocumentPtr”为不明确的符号?程序代码如下:
#import "msxml3.dll"
using namespace MSXML2;inline void TESTHR( HRESULT _hr ) 
   { if FAILED(_hr) throw(_hr); }void XMLDOMNamedNodeMap()
{
    try {
IXMLDOMDocumentPtr docPtr;
IXMLDOMNodePtr DOMNodePtr;
IXMLDOMNamedNodeMapPtr DOMNamedNodeMapPtr;        //init
        TESTHR(CoInitialize(NULL)); 
        TESTHR(docPtr.CreateInstance("Msxml2.DOMDocument.5.0"));
        
        VARIANT vtTemp;        vtTemp.vt=VT_I2;
        vtTemp.iVal = MSXML2::NODE_ATTRIBUTE;        // load a document
        _variant_t varXml("C:\book.xml");
        _variant_t varOut((bool)TRUE);
        varOut = docPtr->load(varXml);
        if ((bool)varOut == FALSE)
            throw(0);
        
        DOMNodePtr = docPtr->createNode(vtTemp, "Sci-Fi", "");
        DOMNamedNodeMapPtr = docPtr->documentElement->attributes;
        DOMNamedNodeMapPtr->setNamedItem(DOMNodePtr);        MessageBox(NULL, _bstr_t(docPtr->xml), _T("New Document"), MB_OK);    } catch(...)
    {
        MessageBox(NULL, _T("Exception occurred"), _T("Error"), MB_OK);
    }
    CoUninitialize();

解决方案 »

  1.   

    #import "msxml5.dll" named_guids
    我这里有个调通的例子
    #include "stdafx.h"
    #include <sstream>
    #include <string>
    #import "msxml4.dll" named_guidsusing namespace MSXML2;
    inline void linefeed(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode)
    {
    pRootNode->appendChild(pXMLDoc->createTextNode("\n"));
    }
    inline void addTextElement(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,LPCTSTR value)
    {
    pRootNode->appendChild(pXMLDoc->createTextNode(value));
    }
    inline void addTabs(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
    {
    std::ostringstream oss;
    for(int i=0;i<tabcount;i++)
    oss<<"\t";
    addTextElement(pXMLDoc,pRootNode,oss.str().c_str());
    }
    void addfile(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
    {
    MSXML2::IXMLDOMElementPtr pTempNode = NULL;

    pTempNode = pXMLDoc->createElement(_T("file"));
    linefeed(pXMLDoc,pTempNode);
    addTabs(pXMLDoc,pTempNode,tabcount+1);
    addTextElement(pXMLDoc,pTempNode,filename);
    linefeed(pXMLDoc,pTempNode);
    addTabs(pXMLDoc,pTempNode,tabcount);
    addTabs(pXMLDoc,pRootNode,tabcount);
    pRootNode->appendChild(pTempNode );
    linefeed(pXMLDoc,pRootNode);
    }
    void savedir(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
    {
    if ((GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
    {
    MSXML2::IXMLDOMNodePtr pDirNode= NULL;  addTabs(pXMLDoc,pRootNode,tabcount);
    pDirNode = pRootNode->appendChild(pXMLDoc->createElement(_T("directory")));
    // Step 6.3b: Creating RecID attribute for the Record element
    MSXML2::IXMLDOMAttributePtr pRecIdAttr = NULL;
    pRecIdAttr = pXMLDoc->createAttribute(_T("pathname"));
    pRecIdAttr->nodeTypedValue = filename;
    pDirNode->attributes->setNamedItem(pRecIdAttr);
    linefeed(pXMLDoc,pDirNode); WIN32_FIND_DATA wfd= {0};
    char allname[MAX_PATH];
    strcpy(allname,filename);
    if(filename[strlen(filename)-1]!='\\')
    strcat(allname,"\\*.*");
    else
    strcat(allname,"*.*");
    HANDLE  hFind = FindFirstFile(allname, &wfd); if (hFind == INVALID_HANDLE_VALUE)
    return ;
    do
    {
    if(wfd.cFileName[0]=='.')
    continue;
    strcpy(allname,filename);
    strcat(allname,"\\");
    strcat(allname,wfd.cFileName);
    if((GetFileAttributes(allname) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
    {
    savedir(allname,pXMLDoc,pDirNode,tabcount+1);
    }
    else
    {
    addfile(wfd.cFileName,pXMLDoc,pDirNode,tabcount+1);
    }
    }while(FindNextFile(hFind, &wfd));
    FindClose(hFind);
    addTabs(pXMLDoc,pDirNode,tabcount); addTabs(pXMLDoc,pRootNode,tabcount);
    }
    else
    {
    addfile(filename,pXMLDoc,pRootNode,tabcount);
    }
    linefeed(pXMLDoc,pRootNode);}
    void test()
    {
    MSXML2::IXMLDOMDocument2Ptr pXMLDoc        = NULL;
    MSXML2::IXMLDOMParseError *pParsingErr = NULL;
    MSXML2::IXMLDOMElement *element     = NULL;
    MSXML2::IXMLDOMNodeList *childs      = NULL; 
    pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0");
    //Creating the Processing Instruction
    MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
    pPI = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
    _variant_t vNullVal;
    vNullVal.vt = VT_NULL;
    pXMLDoc->insertBefore(pPI, vNullVal);
    // Creating the Root Element
    MSXML2::IXMLDOMNodePtr pRootNode= NULL; 
    _variant_t varNodeType((short)MSXML2::NODE_ELEMENT);
    pRootNode= pXMLDoc->createNode(varNodeType, 
    _T("directorysave"), _T(""));
    pXMLDoc->appendChild(pRootNode);
    linefeed(pXMLDoc,pRootNode);
    savedir("c:\\demo1",pXMLDoc,pRootNode,1);
    pXMLDoc->save(_T("c:\\directory.xml"));
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    printf("save directory structure into a well formated(with tab and line feed/carriage return) xml file, by Onega\n");
    CoInitialize(NULL);
    test();
    CoUninitialize();
    return 0;
    }
    //http://expert.csdn.net/Expert/topic/2062/2062662.xml?temp=5.443972E-02
      

  2.   

    你可能没有理解我得意思。我的问题是--名空间已经声明,为什么还提示“IXMLDOMDocumentPtr”为不明确的符号? 
     
      

  3.   

    微软网站上提示.
    The "ambiguous symbol" error occurs when a smart pointer interface definition such as IXMLDOMDocumentPtr is defined in both the MSXML2 namespace (through #import) and the global namespace (through Msxml.h), so that the symbol is ambiguous. When the compiler resolves the interfaces, the compiler looks first in Msxml.h, which has different signatures than those that #import generates.
    就是IXMLDOMDocumentPtr在MSXML2和msxml.h中都定义了.当它编译接口的时候,会先去msxml.h中查找.
    To avoid the errors, explicitly qualify the interface declaration and GUIDs to remove the ambiguity
    解决的办法,就是显式的限定接口声明.就是用MSXML2::IXMLDOMDocumentPtr docPtr; 
      

  4.   

    import的时候指定no_namespace吧。
      

  5.   

    不晓得,你是用什么开发的,好像在vc8里面本身就有该接口,所以会出现那个问题,在vc6里面就没有那个问题。
      

  6.   

    如果使用的VC6,则没有这个问题.
    如果使用的VC7或者更新版本,则会出现此问题,因为在VC7以后的版本里已经包含了MSDOM,而你又使用第三方的库,所以如果没有确定指明使用的是哪一方库,编译器会无法识别.