#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