我装的是msxml4,vc6.0
编译没有错误
当我执行一下代码时,老是装载不上XML文档// 错误处 hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);// xmllearn.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <atlbase.h>
//下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
#include "C:\Program Files\MSXML 4.0\inc\msxml2.h"
#include <iostream>int main(int argc, char* argv[])
{
// 初始化COM接口
CoInitialize(NULL);
//在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文
//件在同一个目录中。该文件的内容如下:
// <?xml version="1.0"?>
// <xmldata>
// <xmlnode />
// <xmltext>Hello, World!</ xmltext>
// </xmldata>
//
//程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的
//节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显
//示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。
try {
// 通过智能指针创建一个解析器的实例。
CComPtr<IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) 
throw "不能创建XML Parser对象";
if ( spXMLDOM.p == NULL ) 
throw "不能创建XML Parser对象";
// 如果对象创建成功的话,就开始装载XML文档
VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
if ( FAILED(hr) ) 
throw "不能够在解析器中装载XML文档";
if ( !bSuccess ) 
throw "不能够在解析器中装载XML文档";
// 检查并搜索"xmldata/xmlnode"
CComBSTR bstrSS(L"xmldata/xmlnode");
CComPtr<IXMLDOMNode> spXMLNode;
//用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) 
throw "不能在XML节点中定位'xmlnode' ";
if ( spXMLNode.p == NULL ) 
throw "不能在XML节点中定位'xmlnode' ";
//DOM对象“spXMLNode”现在包含了XML节点<xmlnode>,所以我们可以在
//它下面创建一个子节点并把找到的该节点作为它的父节点。
CComPtr<IXMLDOMNode> spXMLChildNode;
//用接口IXMLDOMDocument的方法createNode方法创建一个新节点。
hr = spXMLDOM->createNode(
CComVariant(NODE_ELEMENT),
CComBSTR("xmlchildnode"),
NULL,&spXMLChildNode);
if ( FAILED(hr) ) 
throw "不能创建'xmlchildnode' 节点";
if ( spXMLChildNode.p == NULL ) 
throw "不能创建'xmlchildnode' 节点";
//添加新节点到spXMLNode节点下去。
CComPtr<IXMLDOMNode> spInsertedNode;
hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
if ( FAILED(hr) ) 
throw "不能创建'xmlchildnode' 节点";
if ( spInsertedNode.p == NULL ) 
throw "不能移动'xmlchildnode' 节点";
//对新节点添加属性。
CComQIPtr<IXMLDOMElement> spXMLChildElement;
spXMLChildElement = spInsertedNode;
if ( spXMLChildElement.p == NULL )
throw "不能在XML元素接口中查询到'xmlchildnode' ";
//设置新节点的属性
hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
if ( FAILED(hr) ) 
throw "不能插入新的属性";
//下面的程序段用来寻找一个节点并显示该节点的相关信息
// 查找"xmldata/xmltext"节点
spXMLNode = NULL; // 释放先前的节点
bstrSS = L"xmldata/xmltext";
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) 
throw "不能定位'xmltext'节点";
if ( spXMLNode.p == NULL ) 
throw "不能定位'xmltext'节点";
// 得到该节点包含的文本并显示它
CComVariant varValue(VT_EMPTY);
hr = spXMLNode->get_nodeTypedValue(&varValue);
if ( FAILED(hr) ) 
throw "不能提取'xmltext'文本";
if ( varValue.vt == VT_BSTR ) {
// 显示结果,注意这里要把字符串从形式BSTR转化为ANSI
USES_CONVERSION;
LPTSTR lpstrMsg = W2T(varValue.bstrVal);
std::cout << lpstrMsg << std::endl;
} // if
else {
// 如果出现错误
throw "不能提取'xmltext'文本";
} // else
//保存修改过的XML文档到指定的文档名
hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
if ( FAILED(hr) ) 
throw "不能保存修改过的XML文档";
std::cout << "处理完成..." << std::endl << std::endl;
} // try
catch(char* lpstrErr) {
// 出现错误
std::cout << lpstrErr << std::endl << std::endl;
} // catch
catch(...) {
// 未知错误
std::cout << "未知错误..." << std::endl << std::endl;
} // catch
// 结束对COM的使用
CoUninitialize(); return 0;
}
/*---------------------------------------------
// 其中 XML 文档为// 名称 xmldata.xml
// 路径 同可执行程序// 内容:
<?xml version="1.0"?>
<xmldata>
<xmlnode />
<xmltext>Hello, World!</ xmltext>
</xmldata>*///--------------------------------------------

解决方案 »

  1.   

    一下代码出现同样的问题
       HRCALL(pXMLDom->load(var, &status), "");装载不上xml文档//-----------------------------------------------------
    #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;
    }
      

  2.   

    try
    {
    MSXML2::IXMLDOMDocumentPtr pXmldoc = NULL ;
    HRESULT _hr = pXmldoc.CreateInstance("Msxml2.DOMDocument.4.0");

    if(FAILED(_hr))
    {
    throw(_hr);
    } //加载XML文件
    _variant_t varXml(strFileName);
    _variant_t varOut((bool)TRUE);
    pXmldoc->preserveWhiteSpace = true ;
    varOut = pXmldoc->load(varXml);

    if ((bool)varOut == FALSE) 
    {
    //错误处理
    MSXML2::IXMLDOMParseErrorPtr errPtr = pXmldoc->GetparseError();
    _bstr_t bstrErr(errPtr->reason);
    m_Log.StatusOut(_T("载入 %s 出错!\n"), strFileName);
    CString strTemp;
    strTemp.Format(IDS_DTXMLDOMERROR, errPtr->errorCode,errPtr->line,errPtr->linepos,(LPTSTR)bstrErr);
    m_Log.StatusOut(_T("%s"), strTemp);
    return FALSE;
    }
    else
    {
    //解析代码省略。
                               return TRUE;
    }
    }
    catch (_com_error &e)
    {
    CString strTemp;
    strTemp.Format(IDS_DTCOMERROR, e.Error(),(LPTSTR)e.ErrorMessage(),(LPTSTR)e.Source(),(LPTSTR)e.Description());
    m_Log.StatusOut(_T("%s"), strTemp);
    return FALSE;
    }
    catch(...)
    {
    //捕获未知错误
    m_Log.StatusOut(_T("未知错误"));
    return FALSE;
    }
    4、卸载com
    CoUninitialize();
      

  3.   

    你用这种方式调用
    //创建COM对象实例
    hrErr = CoCreateInstance(CLSID_DOMDocument40,
    NULL,
    CLSCTX_INPROC_SERVER, 
    IID_IXMLDOMDocument2,
    (void**)&pXMLDOMDoc);

    if (hrErr == S_OK)
    //如果COM对象实例创建成功
    {
             }然后使用下面的方法调用打开文件:
    strSourceFile指向文件名
    VARIANT_BOOL bLoadSuccess;
    BSTR bstr = NULL;
    bstr = strSourceFile.AllocSysString();
    //读取源文件
    //如果有DTD则也进行有效性检查,否则不进行有效性检查
    hrErr = pXMLDOMDoc->load (_variant_t(bstr),&bLoadSuccess);
    SysFreeString(bstr); if (hrErr == S_OK)
    //如果XML文件读取正确
    {
                      }
      

  4.   

    汉字问题,你的xml文件第一行
    <?xml version="1.0"?>
    修改为:
    <?xml version="1.0" encoding="gb2312"?>
      

  5.   

    不是你说的这个意思,我想知道怎样达到这样的结果,就是用DOM写入XML,使XML文档里有<?xml version="1.0" encoding="gb2312"?>,然后我在读出,可是现在写都写不进去
      

  6.   

    Create andappend processinstruction element
      

  7.   

    我调用createProcessingInstruction方法,能够写入,读的时候,只要碰到汉字,就跳到错误处理行,能解释一下吗,期待中
      

  8.   

    请到这里来,我又开了一帖
    http://community.csdn.net/Expert/topic/3110/3110507.xml?temp=.7014734