我依据MSDN2003中Dom Developer's Guide介绍的步骤来解析XML文件:
1.安装了MSXML4.MSI文件.查看SYSTEM32目录发现MSXML4.DLL和MSXML4R.DLL及MSXML4A.DLL都存在,证明安装成功.
2.用Visual C++ 6.0建立了一个WIN32 Console Application,加入loadDOM.cpp文件(MSDN照COPY):
//----------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;// Macro that calls a COM method returning HRESULT value:
#define HRCALL(a, errmsg) \
do { \
    hr = (a); \
    if (FAILED(hr)) { \
        dprintf( "%s:%d  HRCALL Failed: %s\n  0x%.8x = %s\n", \
                __FILE__, __LINE__, errmsg, hr, #a ); \
        goto clean; \
    } \
} while (0)// Helper function that put output in stdout and debug window
// in Visual Studio:
void dprintf( char * format, ...)
{
    static char buf[1024];
    va_list args;
    va_start( args, format );
    vsprintf( buf, format, args );
    va_end( args);
    OutputDebugStringA( buf);
    printf("%s", buf);
}// Helper function to create a DOM instance:
IXMLDOMDocument* DomFromCOM()
{
   HRESULT hr;
   IXMLDOMDocument *pxmldoc = NULL;    HRCALL( CoCreateInstance(__uuidof(DOMDocument40),
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      __uuidof(IXMLDOMDocument),
                      (void**)&pxmldoc),
            "Create a new DOMDocument");    HRCALL( pxmldoc->put_async(VARIANT_FALSE),
            "should never fail");
    HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE),
            "should never fail");
    HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE),
            "should never fail");   return pxmldoc;
clean:
   if (pxmldoc)
    {
      pxmldoc->Release();
    }
   return NULL;
}
int main(int argc, char* argv[])
{
   IXMLDOMDocument *pXMLDom=NULL;
   IXMLDOMParseError *pXMLErr=NULL;
   BSTR bstr = NULL;
   VARIANT_BOOL status;
   VARIANT var;
   HRESULT hr;   CoInitialize(NULL);   pXMLDom = DomFromCOM();
   if (!pXMLDom) goto clean;   VariantInit(&var);
   V_BSTR(&var) = SysAllocString(L"stocks.xml");
   V_VT(&var) = VT_BSTR;
   HRCALL(pXMLDom->load(var, &status), "");   if (status!=VARIANT_TRUE) {
      HRCALL(pXMLDom->get_parseError(&pXMLErr),"");
      HRCALL(pXMLErr->get_reason(&bstr),"");
      dprintf("Failed to load DOM from stocks.xml. %S\n",
               bstr);
      goto clean;
   }
   HRCALL(pXMLDom->get_xml(&bstr), "");
   dprintf("XML DOM loaded from stocks.xml:\n%S\n",bstr);clean:
   if (bstr) SysFreeString(bstr);
   if (&var) VariantClear(&var);
   if (pXMLErr) pXMLErr->Release();
   if (pXMLDom) pXMLDom->Release();   CoUninitialize();
   return 0;
}
//-----------------------------------------------------------------------------
3.加入一个C++文件,命名为stocks.xml,拷入:
<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="stock.xsl"?>
<portfolio xmlns:dt="urn:schemas-microsoft-com:datatypes">
        <stock exchange="nasdaq">
                <name>new</name>
                <symbol>zzzz</symbol>
                <price dt:dt="number">20.313</price>
        </stock>
        <stock exchange="nyse">
                <name>zacx corp</name>
                <symbol>ZCXM</symbol>
                <price dt:dt="number">28.875</price>
        </stock>
        <stock exchange="nasdaq">
                <name>zaffymat inc</name>
                <symbol>ZFFX</symbol>
                <price dt:dt="number">92.250</price>
        </stock>
        <stock exchange="nasdaq">
                <name>zysmergy inc</name>
                <symbol>ZYSZ</symbol>
                <price dt:dt="number">20.313</price>
        </stock>
</portfolio>
4.F7 Build出现如下错误:
--------------------Configuration: DOM2 - Win32 Debug--------------------
Compiling...
loadDom.cpp
e:\c\dom\loaddom.cpp(31) : error C2872: 'IXMLDOMDocument' : ambiguous symbol
e:\c\dom\loaddom.cpp(34) : error C2872: 'IXMLDOMDocument' : ambiguous symbol
e:\c\dom\loaddom.cpp(41) : error C2872: 'IXMLDOMDocument' : ambiguous symbol
e:\c\dom\loaddom.cpp(62) : error C2872: 'IXMLDOMDocument' : ambiguous symbol
e:\c\dom\loaddom.cpp(63) : error C2872: 'IXMLDOMParseError' : ambiguous symbol
Error executing cl.exe.DOM2.exe - 5 error(s), 0 warning(s)请问问题出在哪里?谢谢!!

解决方案 »

  1.   

    #import "C:\WINNT\system32\msxml4.dll"
    using namespace MSXML2;
      

  2.   

    使用 IXMLDOMDocumentPtr,一般import导入COM组件的动态连接库,都会生成一个用智能指针封装的类
    如果想直接用CoCreateInstance方法,建议还是引用头文件
    #include <msxml2.h>
    在工程设置中添加msxml2.lib
      

  3.   

    我依照 firmbird(firmbird) 的方法可以了:将import改成include,再在Link Module中加入msxml2.lib.
    mousefj(冯杰)的建议好象不可行,跟以前出现一样的错误.
    谢谢两位!!