1.tinyxml2的下載和維護地址:https://github.com/leethomason/tinyxml2
2.要使用的文件tinyxml2.h和tinyxml2.cpp,下面做了一下簡單的封裝,目前項目夠用
注意:tinyxml2裏的指針返回全部使用的"0",而非"nullptr",所以檢測指針是否爲空時用“0”來判斷
xml.h
#ifndef _XML_H__
#define _XML_H__
#include "tinyxml2.h"
using namespace tinyxml2;
class CXml
{
public:
/*創建xml*/
int CreateXml(const char *pcXmlPath);
int CreateXml(const char *pcXmlPath, const char *pcInitXml);
/*添加xml節點或節點元素*/
int AddNode(const char *pcXmlPath, const char *pcRoot);
int AddNode(const char *pcXmlPath, const char *pcRoot, const char *pcNode);
int AddElement(const char *pcXmlPath, const char *pcRoot, const char *pcNode, const char *pcElement, const char *pcElementAttr);
/*修改xml元素信息*/
int ModifyElementAttr(const char *pcXmlPath, const char *pcRoot, const char *pcNode, const char *pcElement, const char *pcElementAttr);
/*刪除節點或節點元素*/
int DeleteRoot(const char *pcXmlPath, const char *pcRoot);
int DeleteNode(const char *pcXmlPath, const char *pcRoot, const char* pcNode);
int DeleteElement(const char *pcXmlPath, const char *pcRoot, const char*pcNode, const char *pcElement);
/*打印xml,調試用*/
void PrintfXml(const char *pcXmlPaht);
public:
CXml();
~CXml();
};
#endif /*_XML_H__*/
xml.cpp
#include "stdafx.h"
#include "xml.h"
CXml::CXml()
{
}
CXml::~CXml()
{
}
void CXml::PrintfXml(const char *pcXmlPaht)
{
XMLDocument doc;
XMLPrinter printer;
if (XML_SUCCESS == doc.LoadFile(pcXmlPaht))
{
doc.Print(&printer);
const char *pcPrint = printer.CStr();
printf("%s", pcPrint);/*輸出到控制檯*/
}
}
int CXml::CreateXml(const char *pcXmlPath)
{
XMLDocument doc;
const char *pcInitXml = "<?xml version=\"1.0\"?>";/*默認xml值*/
return (XML_SUCCESS == doc.Parse(pcInitXml)) ? doc.SaveFile(pcXmlPath) : doc.ErrorID();
}
int CXml::CreateXml(const char *pcXmlPath, const char *pcInitXml)
{
XMLDocument doc;
return (XML_SUCCESS == doc.Parse(pcInitXml)) ? doc.SaveFile(pcXmlPath) : doc.ErrorID();
}
int CXml::AddNode(const char *pcXmlPath, const char *pcRoot)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjRoot = doc.NewElement(pcRoot);
if (0 != pobjRoot)
{
doc.InsertEndChild(pobjRoot);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::AddNode(const char *pcXmlPath, const char *pcRoot, const char *pcNode)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjRoot = doc.FirstChildElement(pcRoot);
XMLElement *pobjNode = doc.NewElement(pcNode);
if ((0 != pobjRoot) && (0 != pobjNode))
{
pobjRoot->InsertEndChild(pobjNode);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::AddElement(const char *pcXmlPath, const char *pcRoot, const char *pcNode, const char *pcElement, const char *pcElementAttr)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjNode = doc.FirstChildElement(pcRoot)->FirstChildElement(pcNode);
if (0 != pobjNode)
{
pobjNode->SetAttribute(pcElement, pcElementAttr);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::ModifyElementAttr(const char *pcXmlPath, const char *pcRoot, const char *pcNode, const char *pcElement, const char *pcElementAttr)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjNode = doc.FirstChildElement(pcRoot)->FirstChildElement(pcNode);
if (0 != pobjNode)
{
pobjNode->SetAttribute(pcElement, pcElementAttr);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::DeleteRoot(const char *pcXmlPath, const char *pcRoot)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjRoot = doc.FirstChildElement(pcRoot);
if (0 != pobjRoot)
{
doc.DeleteChild(pobjRoot);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::DeleteNode(const char *pcXmlPath, const char *pcRoot, const char* pcNode)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjRoot = doc.FirstChildElement(pcRoot);
XMLElement *pobjNode = pobjRoot->FirstChildElement(pcNode);
if ((0 != pobjRoot) && (0 != pobjRoot))
{
pobjRoot->DeleteChild(pobjNode);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
int CXml::DeleteElement(const char *pcXmlPath, const char *pcRoot, const char*pcNode, const char *pcElement)
{
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(pcXmlPath))
{
XMLElement *pobjNode = doc.FirstChildElement(pcRoot)->FirstChildElement(pcNode);
if (0 != pobjNode)
{
pobjNode->DeleteAttribute(pcElement);
return doc.SaveFile(pcXmlPath);
}
}
return doc.ErrorID();
}
main.cpp
#include "stdafx.h"
#include "xml.h"
#define XML_FILE_PATH ".//set.xml"
int _tmain(int argc, _TCHAR* argv[])
{
CXml objXml;
if (XML_SUCCESS == objXml.CreateXml(XML_FILE_PATH))
{
if ((XML_SUCCESS == objXml.AddNode(XML_FILE_PATH, "DRIVER")) &&
(XML_SUCCESS == objXml.AddNode(XML_FILE_PATH, "APP")))/*添加根節點*/
{
if ((XML_SUCCESS == objXml.AddNode(XML_FILE_PATH, "DRIVER", "UART")) &&
(XML_SUCCESS == objXml.AddNode(XML_FILE_PATH, "DRIVER", "SOCK")))/*添加子節點*/
{
/*添加子節點元素信息*/
objXml.AddElement(XML_FILE_PATH, "DRIVER", "UART", "名稱", "COM1");
objXml.AddElement(XML_FILE_PATH, "DRIVER", "UART", "波特率", "9600");
objXml.AddElement(XML_FILE_PATH, "DRIVER", "UART", "數據位", "8");
objXml.AddElement(XML_FILE_PATH, "DRIVER", "UART", "校驗位", "ODD");
objXml.AddElement(XML_FILE_PATH, "DRIVER", "SOCK", "端口號", "6000");
objXml.AddElement(XML_FILE_PATH, "DRIVER", "SOCK", "通信模式", "同步");
/*刪除節點*/
objXml.DeleteNode(XML_FILE_PATH, "DRIVER", "SOCK");
objXml.DeleteElement(XML_FILE_PATH, "DRIVER", "UART", "校驗位");
/*修改節點*/
objXml.ModifyElementAttr(XML_FILE_PATH, "DRIVER", "UART", "名稱", "COM3");
/*查詢節點*/
XMLDocument doc;
if (XML_SUCCESS == doc.LoadFile(XML_FILE_PATH))
{
const char *pcAttr = doc.FirstChildElement("DRIVER")->FirstChildElement("UART")->FindAttribute("波特率")->Value();
printf("Query xml element attr: %s \n", pcAttr);
}
/*輸出XML信息*/
objXml.PrintfXml(XML_FILE_PATH);
}
}
else
{
printf("create root node failure\n");
}
}
else
{
printf("create xml file failure\n");
}
return 0;
}
調試結果: