操作xml资料类的设计,请大家拍转

操作xml文件类的设计,请大家拍转
目前在做一个XML文件的处理类,  xml文件的格式大致如下:

<?xml version="1.0" encoding="utf-8"?>
<response status="ok">
  <node nodeid="T4EJCGpSk7LUfO-l9vjlEA" name="aaaa" description="" createddate="1258900410000"directory="true"  />
  <children>
   <node nodeid="T4EJCGpSk7LUfO-l9vjlEA:7iuDRfRKvunteg*bfRTc6g" name="IMG_0004.JPG" description="" createddate="1258900815000"  />
    <node nodeid="T4EJCGpSk7LUfO-l9vjlEA:Qyl1B7bwEPSNMPokOZrzIg" name="IMG_0005.JPG" description="" createddate="1258900845000"  />
    <node nodeid="T4EJCGpSk7LUfO-l9vjlEA:nxuieVkviJTew3gv3A6cnA" name="IMG_0003.JPG" description="" createddate="1258900786000" />  
</children>
</response>


我采用封装微软的MSXML2中IXMLDOMxxx系列Com对象的方法来实现对上述XML文件的操作。
具体有两个类,代码大致如下:




class ShareAPINodeFolder
{
private:
vector<ShareAPINode> m_nodeList;   
MSXML2::IXMLDOMElementPtr  m_parentElementPtr;
MSXML2::IXMLDOMDocumentPtr  m_xmlDomDocPtr;  

public:
ShareAPINodeFolder(LPCWSTR lpszXmlStr);
{
//代码基本如下:
m_xmlDomDocPtr->loadXML(_bstr_t(lpszXmlStr));   

//typecast  from IxmldomNode  to IxmldomElement
MSXML2::IXMLDOMNodePtr  parentNodePtr = m_xmlDomDocPtr->selectSingleNode(_bstr_t("response/node"));
parentNodePtr->QueryInterface(__uuidof(MSXML2::IXMLDOMElement), (void**)&m_parentElementPtr);

//initialize children List  (vector) 
m_nodeList.clear();

MSXML2::IXMLDOMNodeListPtr childrenNodeListPtr = m_xmlDomDocPtr->selectNodes(_bstr_t("response/children/node"));
long lCount = childrenNodeListPtr->length;

for (int i=0; i<lCount; i++)
{
MSXML2::IXMLDOMElementPtr  childElementPtr;
childrenNodeListPtr->Getitem(i)->QueryInterface(__uuidof(MSXML2::IXMLDOMElement), (void**)&childElementPtr);
m_nodeList.push_back(ShareAPINode(childElementPtr));
}
}

~ShareAPINodeFolder(void);

vector<ShareAPINode>  GetNodeList() const;
ShareAPINode* GetNodeByName(LPCWSTR lpszNodeName) ;   //具体实现是从m_nodeList中取出相应的节点: vector<ShareAPINode>::iterator  result = find_if(m_nodeList.begin(), m_nodeList.end(), Finder(lpszNodeName)); 

ShareAPINode* GetNodeById(LPCWSTR lpszNodeId) ;
LPCWSTR GetFolderId() const;           //具体实现是 return m_parentElementPtr->getAttribute("nodeid").bstrVal;
LPCWSTR GetFolderName() const;
....
}

//class ShareAPINode
class ShareAPINode 
{
private:
MSXML2::IXMLDOMElementPtr m_nodePtr;

public:
ShareAPINode( MSXML2::IXMLDOMElementPtr nodePtr);
~ShareAPINode(void);

public:
LPCWSTR GetNodeId() ;
LPCWSTR GetName() ;
HRESULT  SetName(LPCWSTR lpszNewName);   
......
}




通过这种封装,使用者操作xml文件方便了很多,但同时也有很多问题:
1. MSXML::IXMLDOMxxxPtr的类型是_com_ptr,也就是说是带引用计数的智能指针,用起来不需要关心内存的释放等问题,个人感觉微软的com智能指针甚至比boost的sharedptr还要好用,但经过我这个类的封装,对用户来说,,智能指针的东西就不存在了,用户面对的是ShareAPINode* ShareAPINodeFolder*这样的原生指针类型,要自己new, delete,很容易造成内存泄露和其他内存问题。