TinyXml快速入门(二)
作者:朱金灿 来源:http://www.cnblogs.com/clever101
在《TinyXml快速入门(一)》中我介绍了使用TinyXml库如何创建和打印xml文件,下面我介绍使用tinyxml库对xml文件进行一系列的操作,包括获取xml文件声明,查询指定节点、删除指定节点、修改指定节点和增加节点的用法。在《TinyXml快速入门(一)》中我们知道xml文件中的一个节点元素实际包含两种值:属性和文本。其中属性在我看来可以看作是STL中的map,一个属性带一个属性值,map中也是一个键带一个键值。因此查询指定节点、删除指定节点和增加节点必然是需要实现两种方法,删除指定节点只需要实现一种方法。鉴于内容较多,在本文中介绍获取xml文件声明,查询指定节点、删除指定节点的做法,修改指定节点和增加节点的做法在后续的文章介绍。
首先是获取xml文件声明。xml文件声明包括三方面的内容:Version、Standalone和Encoding。其源码如下:
/*
!
*brief获取xml文件的声明。 * *paramXmlFilexml文件全路径。 *paramstrVersionVersion属性值 *paramstrStandaloneStandalone属性值 *paramstrEncodingEncoding属性值 *return是否成功。true为成功,false表示失败。 */ bool GetXmlDeclare(std:: string XmlFile, std:: string & strVersion,255)">string & strStandalone,255)">string & strEncoding) { // 定义一个TiXmlDocument类指针 TiXmlDocument * pDoc = new TiXmlDocument(); if (NULL == pDoc) { return false ; } pDoc -> LoadFile(XmlFile); TiXmlNode * pXmlFirst = pDoc -> FirstChild(); if (NULL != pXmlFirst) { TiXmlDeclaration * pXmlDec = pXmlFirst -> ToDeclaration(); if (NULL != pXmlDec) { strVersion = pXmlDec -> Version(); strStandalone = pXmlDec -> Standalone(); strEncoding = pXmlDec -> Encoding(); } } true ; }
我们发现无论查询节点、删除节点、修改节点和增加节点,其实都离不开一个函数,就是根据节点名获取相关节点指针。那么我们就先实现一个根据节点名获取节点指针的函数: !
*brief通过根节点和节点名获取节点指针。 * *parampRootElexml文件的根节点。 *paramstrNodeName要查询的节点名 *paramNode需要查询的节点指针 *return是否找到。true为找到相应节点指针,false表示没有找到相应节点指针。 bool GetNodePointerByName(TiXmlElement * pRootEle,std:: string & strNodeName,TiXmlElement * & Node) { 假如等于根节点名,就退出 if (strNodeName == pRootEle -> Value()) { Node = pRootEle; true ; } TiXmlElement * pEle = pRootEle; for (pEle = pRootEle -> FirstChildElement();pEle;pEle = pEle -> NextSiblingElement()) { 递归处理子节点,获取节点指针 if (GetNodePointerByName(pEle,strNodeName,Node)) true ; } false ; } 有了这个函数,我们就很容易实现查询节点的相应文本或属性值。
! *brief通过节点查询。 * *paramXmlFilexml文件全路径。 *paramstrNodeName要查询的节点名 *paramstrText要查询的节点文本 *return是否成功。true为成功,false表示失败。 bool QueryNode_Text(std:: string strNodeName,255)">string & strText) { false ; } pDoc -> LoadFile(XmlFile); TiXmlElement * pRootEle = pDoc -> RootElement(); if (NULL == pRootEle) { false ; } TiXmlElement * pNode = NULL; GetNodePointerByName(pRootEle,pNode); if (NULL != pNode) { const char * psz = pNode -> GetText(); if (NULL == psz) { strText = _T( "" ); } else { strText = psz; } true ; } else { false ; } } ! *brief通过节点查询。 * *paramXmlFilexml文件全路径。 *paramstrNodeName要查询的节点名 *paramAttMap要查询的属性值,这是一个map,前一个为属性名,后一个为属性值 *return是否成功。true为成功,false表示失败。 bool QueryNode_Attribute(std:: < std:: string ,255)">string > & AttMap) { typedefstd::pair < std:: string > String_Pair; TiXmlDocument * pDoc = false ; } TiXmlElement * pNode = NULL; GetNodePointerByName(pRootEle,pNode); if (NULL != pNode) { TiXmlAttribute * pAttr = NULL; for (pAttr = pNode -> FirstAttribute();pAttr;pAttr = pAttr -> Next()) { std:: string strAttName = pAttr -> Name(); std:: string strAttValue = pAttr -> Value(); AttMap.insert(String_Pair(strAttName,strAttValue)); } false ; } 下面是删除指定节点的函数,其中考虑了删除根节点的情况。 !
*brief删除指定节点的值。 * *paramXmlFilexml文件全路径。 *paramstrNodeName指定的节点名。 *return是否成功。true为成功,false表示失败。 bool DelNode(std:: string strNodeName) { 假如是根节点 if (pRootEle == pNode) { if (pDoc -> RemoveChild(pRootEle)) { pDoc -> SaveFile(XmlFile); else false ; } 假如是其它节点 if (NULL != pNode) { TiXmlNode * pParNode = pNode -> Parent(); if (NULL == pParNode) { false ; } TiXmlElement * pParentEle = pParNode -> ToElement(); if (NULL != pParentEle) { if (pParentEle -> RemoveChild(pNode)) pDoc -> SaveFile(XmlFile); false ; } } false ; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |