tinyxml2使用的基本方法

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;
}

調試結果:

發佈了30 篇原創文章 · 獲贊 6 · 訪問量 8273
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章