操作xml文件类的设计,请大伙拍转
操作xml文件类的设计,请大家拍转
目前在做一个XML文件的处理类, xml文件的格式大致如下:
我采用封装微软的MSXML2中IXMLDOMxxx系列Com对象的方法来实现对上述XML文件的操作。
具体有两个类,代码大致如下:
通过这种封装,使用者操作xml文件方便了很多,但同时也有很多问题:
1. MSXML::IXMLDOMxxxPtr的类型是_com_ptr,也就是说是带引用计数的智能指针,用起来不需要关心内存的释放等问题,个人感觉微软的com智能指针甚至比boost的sharedptr还要好用,但经过我这个类的封装,对用户来说,,智能指针的东西就不存在了,用户面对的是ShareAPINode* ShareAPINodeFolder*这样的原生指针类型,要自己new, delete,很容易造成内存泄露和其他内存问题。
2。用std::vector来存放ShareAPINode, 合理么?本来MSXML::IXMLDOMNodeListPtr就可以管理node列表,只是感觉用起来不如stl容器方便很明显,放到vector中这样做会增加内存的开销。
。。。。
我想大家在日常的工作中也会遇到处理类似XML文件的情况,大家如何做的,直接用msxml:Ixmldom....,还是完全自己写解析器,还是象我这样做? 项目中不使用mfc相关类。
上面我写的程序设计上肯定有问题,请大家拍转,或是提建议,给出好的方法,谢了。
------解决方案--------------------
我只用MFC的东西,除非实在没有。
------解决方案--------------------
没必要用容器,自己维护个链表吧
------解决方案--------------------
我觉得根本不需要std::vector去存储子节点列表,多此一举
------解决方案--------------------
帮顶,学习了!
------解决方案--------------------
o
------解决方案--------------------
ding
目前在做一个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,很容易造成内存泄露和其他内存问题。
2。用std::vector来存放ShareAPINode, 合理么?本来MSXML::IXMLDOMNodeListPtr就可以管理node列表,只是感觉用起来不如stl容器方便很明显,放到vector中这样做会增加内存的开销。
。。。。
我想大家在日常的工作中也会遇到处理类似XML文件的情况,大家如何做的,直接用msxml:Ixmldom....,还是完全自己写解析器,还是象我这样做? 项目中不使用mfc相关类。
上面我写的程序设计上肯定有问题,请大家拍转,或是提建议,给出好的方法,谢了。
------解决方案--------------------
我只用MFC的东西,除非实在没有。
------解决方案--------------------
没必要用容器,自己维护个链表吧
------解决方案--------------------
我觉得根本不需要std::vector去存储子节点列表,多此一举
------解决方案--------------------
帮顶,学习了!
------解决方案--------------------
o
------解决方案--------------------
ding