- UID
- 1
- 积分
- 15892
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
现在越来越多的数据和配置采用了xml格式来存放和进行传输解析了。在c++方面,没有本地支持的库,所以需要我们自己去找一下。微软的msxml说实话,确实不咋地,尤其是com的类型变量名字一直指针,让众人看上去就比较反感。开源的tinyxml在这方便做的还不错。简单介绍下使用过程的一点小经验。
在这里发下牢骚,VC6.0以后的各个版本的VS环境对于C++的智能感知都是那么的SB,不管你怎么配置,怎么google都让你非常抓狂,就是不出来。算了不说了。
从网站上下载tinyxml,下载之后解压打开文件夹,里面有一些测试例子,tinyxml.sln支持vs2010了都,不管这些,怎么需要的是那个xml类库。
使用tinyxml我们只需要
tinyxml.cpp,
[url=]tinyxml.h[/url],
tinyxmlerror.cpp,
tinyxmlparser.cpp,
tinystr.cpp,
[url=]tinystr.h[/url] 6个文件即可。注意一旦少拷贝了其中tinyxmlerror.cpp, tinyxmlparser.cpp, 其中一个或者两个,就会报告link错误,呵呵
在目标源文件的头部,添加 #include"tinyxml.h"和#include "tinystr.h"
我们使用xml文件,无外乎这几种操作,
1. 遍历整个xml返回一棵树select
2. 查找特定节点的属性/文本值select
3.插入特定位置一个节点insert
4.更新特定节点的属性/文本值 update
5.创建xml文件 create
6.who knows
据一位网友的博文里面提到,基本应该涵盖数据库的所有操作,xml操作应该像操作数据库一样。我觉得甚是有道理啊。
那么我来列举下,我搜集以及测试成功的相关的操作代码吧,希望能节省一些大家学习的时间。
1.create xml操作
[cpp] view plaincopyprint?
- // 定义一个TiXmlDocument类指针
- TiXmlDocument *pDoc = new TiXmlDocument;
- if (NULL==pDoc)
- {
- return false;
- }
- // 定义一个xml文件头部声明
- TiXmlDeclaration *pDeclaration = new TiXmlDeclaration(("1.0"),(""),(""));
- if (NULL==pDeclaration)
- {
- return false;
- }
- pDoc->LinkEndChild(pDeclaration);
- // 生成一个根节点:MyApp
- TiXmlElement *pRootEle = new TiXmlElement(("MyApp"));
- if (NULL==pRootEle)
- {
- return false;
- }
- pDoc->LinkEndChild(pRootEle);
- // 生成子节点:Messages
- TiXmlElement *pMsg = new TiXmlElement(("Messages"));
- if (NULL==pMsg)
- {
- return false;
- }
- pRootEle->LinkEndChild(pMsg);
- // 生成子节点:Welcome
- TiXmlElement *pWelcome = new TiXmlElement(("Welcome"));
- if (NULL==pWelcome)
- {
- return false;
- }
- pMsg->LinkEndChild(pWelcome);
- // 设置Welcome节点的值
- const char* strValue = ("Welcome to MyApp");
- TiXmlText *pWelcomeValue = new TiXmlText(strValue);
- pWelcome->LinkEndChild(pWelcomeValue);
- // 生成子节点:Farewell
- TiXmlElement *pFarewell = new TiXmlElement(("Farewell"));
- if (NULL==pFarewell)
- {
- return false;
- }
- pMsg->LinkEndChild(pFarewell);
- // 设置Farewell节点的值
- strValue = ("Thank you for using MyApp");
- TiXmlText *pFarewellValue = new TiXmlText(strValue);
- pFarewell->LinkEndChild(pFarewellValue);
- // 生成子节点:Windows
- TiXmlElement *pWindows = new TiXmlElement(("Windows"));
- if (NULL==pWindows)
- {
- return false;
- }
- pRootEle->LinkEndChild(pWindows);
- // 生成子节点:Window
- TiXmlElement *pWindow = new TiXmlElement(("Window"));
- if (NULL==pWindow)
- {
- return false;
- }
- pWindows->LinkEndChild(pWindow);
- // 设置节点Window的值
- pWindow->SetAttribute(("name"),("MainFrame"));
- pWindow->SetAttribute(("x"),("5"));
- pWindow->SetAttribute(("y"),("15"));
- pWindow->SetAttribute(("w"),("400"));
- pWindow->SetAttribute(("h"),("250"));
- // 生成子节点:Window
- TiXmlElement *pConnection = new TiXmlElement(("Connection"));
- if (NULL==pConnection)
- {
- return false;
- }
- pRootEle->LinkEndChild(pConnection);
- // 设置节点Connection的值
- pConnection->SetAttribute(("ip"),("192.168.0.1"));
- pConnection->SetAttribute(("timeout"),("123.456000"));
- pDoc->SaveFile("1.xml");
// 定义一个TiXmlDocument类指针 TiXmlDocument *pDoc = new TiXmlDocument; if (NULL==pDoc) { return false; } // 定义一个xml文件头部声明 TiXmlDeclaration *pDeclaration = new TiXmlDeclaration(("1.0"),(""),("")); if (NULL==pDeclaration) { return false; } pDoc->LinkEndChild(pDeclaration); // 生成一个根节点:MyApp TiXmlElement *pRootEle = new TiXmlElement(("MyApp")); if (NULL==pRootEle) { return false; } pDoc->LinkEndChild(pRootEle); // 生成子节点:Messages TiXmlElement *pMsg = new TiXmlElement(("Messages")); if (NULL==pMsg) { return false; } pRootEle->LinkEndChild(pMsg); // 生成子节点:Welcome TiXmlElement *pWelcome = new TiXmlElement(("Welcome")); if (NULL==pWelcome) { return false; } pMsg->LinkEndChild(pWelcome); // 设置Welcome节点的值 const char* strValue = ("Welcome to MyApp"); TiXmlText *pWelcomeValue = new TiXmlText(strValue); pWelcome->LinkEndChild(pWelcomeValue); // 生成子节点:Farewell TiXmlElement *pFarewell = new TiXmlElement(("Farewell")); if (NULL==pFarewell) { return false; } pMsg->LinkEndChild(pFarewell); // 设置Farewell节点的值 strValue = ("Thank you for using MyApp"); TiXmlText *pFarewellValue = new TiXmlText(strValue); pFarewell->LinkEndChild(pFarewellValue); // 生成子节点:Windows TiXmlElement *pWindows = new TiXmlElement(("Windows")); if (NULL==pWindows) { return false; } pRootEle->LinkEndChild(pWindows); // 生成子节点:Window TiXmlElement *pWindow = new TiXmlElement(("Window")); if (NULL==pWindow) { return false; } pWindows->LinkEndChild(pWindow); // 设置节点Window的值 pWindow->SetAttribute(("name"),("MainFrame")); pWindow->SetAttribute(("x"),("5")); pWindow->SetAttribute(("y"),("15")); pWindow->SetAttribute(("w"),("400")); pWindow->SetAttribute(("h"),("250")); // 生成子节点:Window TiXmlElement *pConnection = new TiXmlElement(("Connection")); if (NULL==pConnection) { return false; } pRootEle->LinkEndChild(pConnection); // 设置节点Connection的值 pConnection->SetAttribute(("ip"),("192.168.0.1")); pConnection->SetAttribute(("timeout"),("123.456000")); pDoc->SaveFile("1.xml");
2.遍历打印xml文件 select操作
[cpp] view plaincopyprint?
- //TiXmlDocument *pDoc = new TiXmlDocument();
- if (NULL==pDoc)
- {
- return false;
- }
- pDoc->LoadFile("1.xml");
- pDoc->Print();
//TiXmlDocument *pDoc = new TiXmlDocument(); if (NULL==pDoc) { return false; } pDoc->LoadFile("1.xml"); pDoc->Print();
3.获取单个节点值
[cpp] view plaincopyprint?
- 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 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; }
[cpp] view plaincopyprint?
- bool QueryNode_Text(std::string XmlFile,std::string strNodeName,std::string &strText)
- {
- // 定义一个TiXmlDocument类指针
- 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_Text(std::string XmlFile,std::string strNodeName,std::string &strText) { // 定义一个TiXmlDocument类指针 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; } }
[cpp] view plaincopyprint?
- bool QueryNode_Attribute(std::string XmlFile,std::string strNodeName,std::map<std::string,std::string> &AttMap)
- {
- // 定义一个TiXmlDocument类指针
- typedef std::pair <std::string,std::string> 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 QueryNode_Attribute(std::string XmlFile,std::string strNodeName,std::map<std::string,std::string> &AttMap) { // 定义一个TiXmlDocument类指针 typedef std::pair <std::string,std::string> 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; }
4.删除节点操作
[cpp] view plaincopyprint?
- bool DelNode(std::string XmlFile,std::string strNodeName)
- {
- // 定义一个TiXmlDocument类指针
- 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;
- }
bool DelNode(std::string XmlFile,std::string strNodeName) { // 定义一个TiXmlDocument类指针 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; }
5.修改节点操作
[cpp] view plaincopyprint?
- bool ModifyNode_Text(std::string XmlFile,std::string strNodeName,std::string strText)
- {
- // 定义一个TiXmlDocument类指针
- 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)
- {
- pNode->Clear(); // 首先清除所有文本
- // 然后插入文本,保存文件
- TiXmlText *pValue = new TiXmlText(strText);
- pNode->LinkEndChild(pValue);
- pDoc->SaveFile(XmlFile);
- return true;
- }
- else
- return false;
- }
bool ModifyNode_Text(std::string XmlFile,std::string strNodeName,std::string strText) { // 定义一个TiXmlDocument类指针 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) { pNode->Clear(); // 首先清除所有文本 // 然后插入文本,保存文件 TiXmlText *pValue = new TiXmlText(strText); pNode->LinkEndChild(pValue); pDoc->SaveFile(XmlFile); return true; } else return false; }
[cpp] view plaincopyprint?
- bool ModifyNode_Attribute(std::string XmlFile,std::string strNodeName,
- std::map<std::string,std::string> &AttMap)
- {
- typedef std::pair <std::string,std::string> String_Pair;
- // 定义一个TiXmlDocument类指针
- 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;
- std::string strAttName = _T("");
- std::string strAttValue = _T("");
- for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next())
- {
- strAttName = pAttr->Name();
- std::map<std::string,std::string>::iterator iter;
- for (iter=AttMap.begin();iter!=AttMap.end();iter++)
- {
- if (strAttName==iter->first)
- {
- pAttr->SetValue(iter->second);
- }
- }
- }
- pDoc->SaveFile(XmlFile);
- return true;
- }
- else
- {
- return false;
- }
- }
bool ModifyNode_Attribute(std::string XmlFile,std::string strNodeName, std::map<std::string,std::string> &AttMap) { typedef std::pair <std::string,std::string> String_Pair; // 定义一个TiXmlDocument类指针 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; std::string strAttName = _T(""); std::string strAttValue = _T(""); for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next()) { strAttName = pAttr->Name(); std::map<std::string,std::string>::iterator iter; for (iter=AttMap.begin();iter!=AttMap.end();iter++) { if (strAttName==iter->first) { pAttr->SetValue(iter->second); } } } pDoc->SaveFile(XmlFile); return true; } else { return false; } }
6增加节点操作
[cpp] view plaincopyprint?
- bool AddNode_Text(std::string XmlFile,std::string strParNodeName,std::string strNodeName,std::string strText)
- {
- // 定义一个TiXmlDocument类指针
- 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,strParNodeName,pNode);
- if (NULL!=pNode)
- {
- // 生成子节点:pNewNode
- TiXmlElement *pNewNode = new TiXmlElement(strNodeName);
- if (NULL==pNewNode)
- {
- return false;
- }
- // 设置节点文本,然后插入节点
- TiXmlText *pNewValue = new TiXmlText(strText);
- pNewNode->LinkEndChild(pNewValue);
- pNode->InsertEndChild(*pNewNode);
- pDoc->SaveFile(XmlFile);
- return true;
- }
- else
- return false;
- }
bool AddNode_Text(std::string XmlFile,std::string strParNodeName,std::string strNodeName,std::string strText) { // 定义一个TiXmlDocument类指针 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,strParNodeName,pNode); if (NULL!=pNode) { // 生成子节点:pNewNode TiXmlElement *pNewNode = new TiXmlElement(strNodeName); if (NULL==pNewNode) { return false; } // 设置节点文本,然后插入节点 TiXmlText *pNewValue = new TiXmlText(strText); pNewNode->LinkEndChild(pNewValue); pNode->InsertEndChild(*pNewNode); pDoc->SaveFile(XmlFile); return true; } else return false; }
[cpp] view plaincopyprint?
- bool AddNode_Attribute(std::string XmlFile,std::string strParNodeName,std::string strNodeName,std::map<std::string,std::string> &AttMap)
- {
- // 定义一个TiXmlDocument类指针
- 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,strParNodeName,pNode);
- if (NULL!=pNode)
- {
- // 生成子节点:pNewNode
- TiXmlElement *pNewNode = new TiXmlElement(strNodeName);
- if (NULL==pNewNode)
- {
- return false;
- }
- // 设置节点的属性值,然后插入节点
- std::map<std::string,std::string>::iterator iter;
- for (iter=AttMap.begin();iter!=AttMap.end();iter++)
- {
- pNewNode->SetAttribute(iter->first,iter->second);
- }
- pNode->InsertEndChild(*pNewNode);
- pDoc->SaveFile(XmlFile);
- return true;
- }
- else
- return false;
- }
bool AddNode_Attribute(std::string XmlFile,std::string strParNodeName,std::string strNodeName,std::map<std::string,std::string> &AttMap) { // 定义一个TiXmlDocument类指针 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,strParNodeName,pNode); if (NULL!=pNode) { // 生成子节点:pNewNode TiXmlElement *pNewNode = new TiXmlElement(strNodeName); if (NULL==pNewNode) { return false; } // 设置节点的属性值,然后插入节点 std::map<std::string,std::string>::iterator iter; for (iter=AttMap.begin();iter!=AttMap.end();iter++) { pNewNode->SetAttribute(iter->first,iter->second); } pNode->InsertEndChild(*pNewNode); pDoc->SaveFile(XmlFile); return true; } else return false; }
如果你想了解更多的操作以及细化,请参看参考文档了。
|
|