现在的位置: 首页 > 综合 > 正文

VC 操作 XML 类

2013年08月09日 ⁄ 综合 ⁄ 共 4113字 ⁄ 字号 评论关闭

#ifndef _CXML_h_
#define _CXML_h_

#include <msxml.h> 
#import <msxml.dll> // 引入 OLE 类型库

/****************************************************************************/
// XML 操作类
//
// 已有操作:
// (1)   添加树的根节点
// (2)   添加子节点
// (3)   查询指定节点的信息(text, attribute-value)
// (4)   修改指定节点的信息(text, attribute-value)
// (5)   得到子节点的相关信息时, 可以用 FindNode 得到指定节点后遍历其子节点
//
// 完成日期: 2007-12-5
//
// 修改时间: 2007-12-6
// 修改内容: 添加了设置 text 属性和 attr-value 的功能
/****************************************************************************/

class CXML
{
public:

 CXML()
 {
  ::CoInitialize( NULL );

  HRESULT hRet = m_pDoc.CreateInstance( __uuidof(MSXML::DOMDocument) );
  
  if ( FAILED(hRet) )
  {
   ::AfxMessageBox("Doc CreateInstance 失败", MB_ICONSTOP );
  }
 }

 ~CXML()
 {
  ::CoUninitialize();
 }

 void SetFileName ( CString strFileName )
 {
  m_strFileName = strFileName ;
 }
 

 void LoadFile()
 {
  m_pDoc->load( _bstr_t(m_strFileName ) ); 
 }

 void SaveFile()
 {
  m_pDoc->save( _bstr_t(m_strFileName ) );
 }
 
 /*
  * 通过该函数给某个节点添加属性时,会出现同一根下有相同名字的子节点
  */
 void AddNode( CString strParent, CString strChild,  CString strChildText,
     CString strChildAttr = "", CString strChildValue = "" )
 {
  
  MSXML::IXMLDOMElementPtr chidPtr;
  CString strTemp ;

  m_pElement = FindNode(strParent);
  if (m_pElement == NULL)
  {
   // 检查是否是根节点
   m_pElement = m_pDoc->GetfirstChild() ;
   
   strTemp.Format("%s", (CHAR *)( m_pElement->GetbaseName() ));
   
   if ( strTemp != strParent )
   { 
    // 既不是根节点也不是子节点, 该节点不存在
    return ;
   }
  }
  
  // 创建子 Node
  chidPtr = m_pDoc->createElement( (LPCTSTR)strChild );
  chidPtr ->put_text( _bstr_t( (LPCTSTR)strChildText ) );  
  if ( strChildAttr != "")
  {
   chidPtr->setAttribute( (LPCTSTR)strChildAttr , _bstr_t((LPCTSTR)strChildValue ) );
  }
    
  // 添加子节点
  m_pElement ->appendChild( chidPtr );
 }

 /*
  * 给指定的节点添加属性
  */
 //void AddAttribute()
 //{
 // MSXML::IXMLDOMElementPtr p;
 // p = FindNode( strNode );
 // if ( )
 //}

 // 添加整个文档的根节点
 void AddRootNode( CString strRootNode , CString strText = "")
 {
  m_pElement = m_pDoc->createElement( (LPCTSTR)strRootNode );
  
  m_pElement ->put_text( _bstr_t( (LPCTSTR)strText) );

  m_pDoc->appendChild( m_pElement );
 }
 

 void RemoveNode( CString strNode )
 {
  MSXML::IXMLDOMElementPtr p;
    
  p = FindNode( strNode );

  if (p != NULL)
  {
   /*
    * 从父节点删除子节点
    */
   p ->GetparentNode()->removeChild( p );
  }
 }
 
 /*
  * 得到节点 Text 信息
  */ 
 void GetNodeText( CString strNodeName, CString & strText )
 {  
  GetNodeInfo( strNodeName, strText ,"", NULL);
 }
 
 /*
  * 得到节点 Attr-Value 信息
  */
 void GetNodeAttr_Value(CString strNodeName, CString strAttr, CString *strValue )
 {
  CString strText ;

  GetNodeInfo( strNodeName, strText, strAttr, strValue ); 
 }

 
 bool SetNodeInfo( CString strNodeName,  CString strChildText,
      CString strChildAttr = "", CString strChildValue = "" )
 {  
  MSXML::IXMLDOMElementPtr pElement ;
  CString strTreeRootNodeName ;

  pElement = FindNode( strNodeName );

  if ( pElement == NULL )
  {
   return false;
  }
  
  /*
   * 设置节点的text attr--value . attr--value可以有多个
    */
  if ( strChildText!= "")
  {
   pElement->put_text( _bstr_t((LPCTSTR)strChildText) );
  }

  if ( strChildAttr != "")
  {
   pElement->setAttribute( (LPCTSTR)strChildAttr,
         (LPCTSTR)strChildValue
         );
  }
  

  return true ;
 }

protected:

 void GetNodeInfo( CString strNodeName,
      CString &strText,
      CString strAttr="",
      CString *strValue = NULL)
 {
  MSXML::IXMLDOMElementPtr pElement ;
   
  _bstr_t temp;

  pElement = FindNode( strNodeName );
  
  if (pElement != NULL )
  {
   strText.Format("%s", (CHAR *)pElement->Gettext () );

   if ( strAttr != "")
   {
    temp = pElement->getAttribute( (LPCTSTR)strAttr );

    strValue->Format("%s", (CHAR *)temp );
   }

  }else
  {
   strText.Empty() ;

   strValue->Empty() ;
  }

 }

 MSXML::IXMLDOMNodePtr FindNode( CString strNode )
 {
  MSXML::IXMLDOMElementPtr  pElement;
  CString strTreeRootNodeName;

  m_pElements = m_pDoc->GetdocumentElement();  
  
  pElement = m_pElements->selectSingleNode( (LPCTSTR)strNode );

  if ( pElement == NULL )
  {
   /*
    * 检查是否是根节点
    */
   pElement = m_pDoc->GetfirstChild();
   
   strTreeRootNodeName.Format("%s",
      (CHAR *)( pElement ->GetbaseName() ) );
   
   if ( strNode != strTreeRootNodeName )
   {
    /* 既不是子节点又不是根节点, 说明文档中不存在该节点,返回 */
    return NULL ;

   }    
  }

  return pElement ;
 }

private:
 

 MSXML::IXMLDOMElementPtr m_pElements ;  // 所有 Node 的集合
 MSXML::IXMLDOMElementPtr m_pElement ;  // 指向某一节点
 MSXML::IXMLDOMElementPtr m_pTreeRootNode ; // 指向根节点
 MSXML::IXMLDOMDocumentPtr m_pDoc;    // 整个文档的对象
 
 CString m_strFileName ;

};

#endif

抱歉!评论已关闭.