作者:朱金灿
来源:http://blog.csdn.net/clever101
在《TinyXml快速入门(一) 》中我介绍了使用TinyXml库如何创建和打印xml文件,下面我介绍使用tinyxml库对xml文件进行一系列的操作,包括获取xml文件声明,查询指定节点、删除指定节点、修改指定节点和增加节点的用法。在《TinyXml快速入门(一)》中我们知道xml文件中的一个节点元素实际包含两种值:属性和文本。其中属性在我看来可以看作是STL中的map,一个属性带一个属性值,map中也是一个键带一个键值。因此查询指定节点、删除指定节点和增加节点必然是需要实现两种方法,删除指定节点只需要实现一种方法。鉴于内容较多,在本文中介绍获取xml文件声明,查询指定节点、删除指定节点的做法,修改指定节点和增加节点的做法在后续的文章介绍。
首先是获取xml文件声明。xml文件声明包括三方面的内容:Version、Standalone和Encoding。其源码如下:
-
-
-
-
-
-
-
-
-
- bool GetXmlDeclare(std::string XmlFile,
- std::string &strVersion,
- std::string &strStandalone,
- std::string &strEncoding)
- {
-
- 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();
- }
- }
- return true;
- }
我们发现无论查询节点、删除节点、修改节点和增加节点,其实都离不开一个函数,就是根据节点名获取相关节点指针。那么我们就先实现一个根据节点名获取节点指针的函数:
-
-
-
-
-
-
-
-
- bool GetNodePointerByName(TiXmlElement* pRootEle,std::string &strNodeName,TiXmlElement* &Node)
- {
-
- if (strNodeName==pRootEle->Value())
- {
- Node = pRootEle;
- return true;
- }
- TiXmlElement* pEle = pRootEle;
- for (pEle = pRootEle->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
- {
-
- if(GetNodePointerByName(pEle,strNodeName,Node))
- return true;
- }
- return false;
- }
有了这个函数,我们就很容易实现查询节点的相应文本或属性值。
-
-
-
-
-
-
-
-
- bool QueryNode_Text(std::string XmlFile,std::string strNodeName,std::string &strText)
- {
-
- TiXmlDocument *pDoc = new TiXmlDocument();
- if (NULL==pDoc)
- {
- return false;
- }
- pDoc->LoadFile(XmlFile);
- TiXmlElement *pRootEle = pDoc->RootElement();
- if (NULL==pRootEle)
- {
- return false;
- }
- TiXmlElement *pNode = NULL;
- GetNodePointerByName(pRootEle,strNodeName,pNode);
- if (NULL!=pNode)
- {
- strText = pNode->GetText();
- return true;
- }
- else
- {
- return false;
- }
-
- }
-
-
-
-
-
-
-
-
- bool QueryNode_Attribute(std::string XmlFile,std::string strNodeName,std::map &AttMap)
- {
-
- typedef std::pair String_Pair;
- TiXmlDocument *pDoc = new TiXmlDocument();
- if (NULL==pDoc)
- {
- return false;
- }
- pDoc->LoadFile(XmlFile);
- TiXmlElement *pRootEle = pDoc->RootElement();
- if (NULL==pRootEle)
- {
- return false;
- }
- TiXmlElement *pNode = NULL;
- GetNodePointerByName(pRootEle,strNodeName,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));
- }
- return true;
- }
- else
- {
- return false;
- }
- return true;
- }
下面是删除指定节点的函数,其中考虑了删除根节点的情况:
-
-
-
-
-
-
-
- bool DelNode(std::string XmlFile,std::string strNodeName)
- {
-
- TiXmlDocument *pDoc = new TiXmlDocument();
- if (NULL==pDoc)
- {
- return false;
- }
- pDoc->LoadFile(XmlFile);
- TiXmlElement *pRootEle = pDoc->RootElement();
- if (NULL==pRootEle)
- {
- return false;
- }
- TiXmlElement *pNode = NULL;
- GetNodePointerByName(pRootEle,strNodeName,pNode);
-
- if (pRootEle==pNode)
- {
- if(pDoc->RemoveChild(pRootEle))
- {
- pDoc->SaveFile(XmlFile);
- return true;
- }
- else
- return false;
- }
-
- if (NULL!=pNode)
- {
- TiXmlNode *pParNode = pNode->Parent();
- if (NULL==pParNode)
- {
- return false;
- }
-
- TiXmlElement* pParentEle = pParNode->ToElement();
- if (NULL!=pParentEle)
- {
- if(pParentEle->RemoveChild(pNode))
- pDoc->SaveFile(XmlFile);
- else
- return false;
- }
- }
- else
- {
- return false;
- }
- return false;
- }
阅读(1724) | 评论(0) | 转发(0) |