打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
刚开始学习xml,请教

   
   
     
 
我装的是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>



*///--------------------------------------------

             

               

 
 
   
   
    更多
    0
 

  分享到:
 
 
 
 



               

                   

    相关主题推荐:
      xml
      智能指针
      对象
      iostream
      实例
 


                 
               

             


             
             
             
       


     

         

 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 

    回复次数:11


     


 
 
 
     
     
   
   
     
 

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #1
              得分:0
           

         
              回复于:
            2004-06-08 10:48:54
         

       

       



            一下代码出现同样的问题

   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;

}

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #2
              得分:0
           

         
              回复于:
            2004-06-09 09:52:06
         

       

       



            没有人啊,自己给自己分行吗

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            csdnseeman
           
         

         

            csdnseeman
         

         
等级:

         
         
       


     

               

           
              #3
              得分:0
           

         
              回复于:
            2004-06-09 10:15:11
         

       

       



            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();

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            liuxianzhi
           
         

         

            liuxianzhi
         

         
等级:

         
         
       


     

               

           
              #4
              得分:0
           

         
              回复于:
            2004-06-09 17:32:24
         

       

       



            你用这种方式调用

//创建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文件读取正确

{

                  }

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            sharkhuang
           
         

         

            sharkhuang
         

         
等级:

         
         
2
2

       


     

               

           
              #5
              得分:0
           

         
              回复于:
            2004-06-12 10:52:10
         

       

       



            too long

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #6
              得分:0
           

         
              回复于:
            2004-06-14 15:38:26
         

       

       



            以上那些,我一已经解决了,可是当值是汉字的时候,怎么老出错呢,有人知道吗,多谢,分另算

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            xxf2002
           
         

         

            xxf2002
         

         
等级:

         
         
       


     

               

           
              #7
              得分:0
           

         
              回复于:
            2004-06-20 19:57:02
         

       

       



            汉字问题,你的xml文件第一行

<?xml version="1.0"?>

修改为:

<?xml version="1.0" encoding="gb2312"?>

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #8
              得分:0
           

         
              回复于:
            2004-06-21 12:01:14
         

       

       



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

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            jiangsheng
           

         

         

            蒋晟
         

         
等级:

         
          更多勋章
       


     

               

           
              #9
              得分:0
           

         
              回复于:
            2004-06-21 12:23:54
         

       

       



            Create andappend processinstruction element

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     
   
   
     
 

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #10
              得分:0
           

         
              回复于:
            2004-06-21 16:10:39
         

       

       



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

       


     

         

   
 

      对我有用[0]
      丢个板砖[0]
      引用 |
      举报 |
   
     
      管理
   

 



     


 
 
     
     

               

         

           

         

         

            ddvp
           
         

         

            ddvp
         

         
等级:

         
         
       


     

               

           
              #11
              得分:0
           

         
              回复于:
            2004-06-21 16:56:14
         

       

       



            请到这里来,我又开了一帖

http://community.csdn.net/Expert/topic/3110/3110507.xml?temp=.7014734
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用 MSXML 分析器处理 XML 文档
vc中的XML编程心得【原创】,懿懿博客
MFC XML 读写
VC++ MSXML创建XML文件以及对XML文档解析
flash与client交互
VB+Flash通讯归纳
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服