笑看风云淡

宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒
posts - 96, comments - 48, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

DOM 读写XML文件

Posted on 2008-08-28 11:53 天之骄子 阅读(632) 评论(0)  编辑 收藏 引用

//定义智能接口指针
#include<comdef.h>
#include<msxml.h>
_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument,__uuidof(IXMLDOMDocument));
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement,__uuidof(IXMLDOMElement));
_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList,__uuidof(IXMLDOMNodeList));
_COM_SMARTPTR_TYPEDEF(IXMLDOMNode,__uuidof(IXMLDOMNode));
//IXMLDOMElement 初始化指向根节点;注意相当于数据库database
//IXMLDOMNodeList 子节点链表;注意相当于表table;或者相当于记录recordset
//IXMLDOMNode 子节点链表中指定节点的指针;注意相当于得到表中指定的一条记录,也可以是单个字段

/*

#import <msxml.dll> named_guids
using namespace MSXML;
替代上面

*/

 

bool GetxmlData(void)
{
 bool loop=false;
 //XML文档指针
 HRESULT hr=S_OK;
    IXMLDOMDocumentPtr ptrXMLFile=NULL;
 hr=ptrXMLFile.CreateInstance(CLSID_DOMDocument);
 if(SUCCEEDED(hr)&& ptrXMLFile!=NULL)
 {
  //得到XML文件的路径
  CStringA path;
  m_HttpRequest.GetPhysicalPath(path);
  path.Append("Product.xml");
  
  //加载XML文档
        VARIANT_BOOL vbLoaded=VARIANT_FALSE;
  ptrXMLFile->put_async(VARIANT_FALSE);
  ptrXMLFile->load(_variant_t(path),&vbLoaded);
  
  //成功加载后的处理
  if(SUCCEEDED(hr)&& vbLoaded==VARIANT_TRUE)
  {
   
   //XML文档元素指针,初始化指向根节点;注意相当于数据库database
   IXMLDOMElementPtr ptrDocRoot=NULL;
   hr=ptrXMLFile->get_documentElement(&ptrDocRoot);
   if(SUCCEEDED(hr)&&ptrDocRoot!=NULL)
   {
    
    //获取子节点链表;注意相当于表table;或者相当于记录recordset
    IXMLDOMNodeListPtr ptrProductList=NULL;
    hr=ptrDocRoot->get_childNodes(&ptrProductList);
    if(SUCCEEDED(hr)&& ptrProductList!=NULL)
    {
     //获取子节点链表中的个数;注意相当于得到记录的个数
     long productNum=0;
     hr=ptrProductList->get_length(&productNum);
     if(SUCCEEDED(hr)&& productNum)
     {
      
      //获取子节点链表中指定节点的指针;注意相当于得到表中指定的一条记录,
      //这里是相当整个字段
      IXMLDOMNodePtr ptrProduct=NULL;
      static long NodeNum=0;//注意事项记录号index
      hr=ptrProductList->get_item(NodeNum,&ptrProduct);
      loop=true;
      NodeNum++;
      if(NodeNum>productNum)
      { loop=false; }
      
      if(SUCCEEDED(hr)&&ptrProduct!=NULL)
      {
       
       //单个字段,及name,这里也就是最小标签元素
       IXMLDOMNodePtr Field=NULL;
       _bstr_t bField;
       BSTR Text=NULL;
       bField="name";
       
       //获取name元素的内容
       hr=ptrProduct->selectSingleNode(bField,&Field);
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);//修改用Field->put_text(&Text);
        m_name=Text;
        Text=NULL;
        Field=NULL;
       }
       
       //获取price1元素的内容
       bField="price1";
       hr=ptrProduct->selectSingleNode(bField,&Field);
       CString S1;
       wchar_t * S2;
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);
        S1=Text;
        S2=S1.GetBuffer(S1.GetLength());
        S1.ReleaseBuffer();
        m_price[0]=_wtof(S2);
         SysFreeString(Text);
        Text=NULL;
        Field=NULL;
       }
       
       //获取price2元素的内容
                            bField="price2";
       hr=ptrProduct->selectSingleNode(bField,&Field);
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);
        S1=Text;
        S2=S1.GetBuffer(S1.GetLength());
        S1.ReleaseBuffer();
        m_price[1]=_wtof(S2);
         SysFreeString(Text);
        Text=NULL;
        Field=NULL;
       }
       
       //获取price3元素的内容
       bField="price3";
       hr=ptrProduct->selectSingleNode(bField,&Field);
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);
        S1=Text;
        S2=S1.GetBuffer(S1.GetLength());
        S1.ReleaseBuffer();
        m_price[2]=_wtof(S2);
         SysFreeString(Text);
        Text=NULL;
        Field=NULL;
       }
       
       //获取price4元素的内容
       bField="price4";
       hr=ptrProduct->selectSingleNode(bField,&Field);
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);
        S1=Text;
        S2=S1.GetBuffer(S1.GetLength());
        S1.ReleaseBuffer();
        m_price[3]=_wtof(S2);
         SysFreeString(Text);
        Text=NULL;
        Field=NULL;
       }
       
       //获取price5元素的内容
       bField="price5";
       hr=ptrProduct->selectSingleNode(bField,&Field);
       if(SUCCEEDED(hr)&& Field!=NULL)
       {
        Field->get_text(&Text);
        S1=Text;
        S2=S1.GetBuffer(S1.GetLength());
        S1.ReleaseBuffer();
        m_price[4]=_wtof(S2);
         SysFreeString(Text);
        Text=NULL;
        Field=NULL;
       }
       ptrProduct=NULL;

      }
     }
     ptrProductList=NULL;
    }
    ptrDocRoot=NULL;
   }
  }
  ptrXMLFile=NULL;
 }
 m_start=true;
 return loop;
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理