⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlconfig.cpp

📁 在Linux C++中解析XML文件 能够创建文件
💻 CPP
字号:
#include "Log.h"
#include "XMLConfig.h"
#include "XMLParserException.h"

using namespace Davis;

CXMLConfig::CXMLConfig(const char* szXmlFilename)
{
	m_strFilename = szXmlFilename;
	xmlNodePtr curNodePtr;  
	
	m_doc = xmlReadFile(szXmlFilename,"UTF-8",XML_PARSE_RECOVER);  
	if (m_doc == NULL)
	{ 	
		xmlFreeDoc(m_doc);
		throw XMLParserException("Document not parsed successfully.");
	}
	curNodePtr = xmlDocGetRootElement(m_doc);  
	
	if (curNodePtr == NULL)
	{
		xmlFreeDoc(m_doc);
		throw XMLParserException("empty document.");
	}
}

CXMLConfig* CXMLConfig::Open(const char* szXmlFilename)
{
	CXMLConfig* xmlConfig = new CXMLConfig(szXmlFilename);
	return xmlConfig;
}

CXMLConfig::~CXMLConfig()
{
	if (NULL != m_doc)
	{
		xmlFreeDoc(m_doc);
	}
} 

xmlXPathObjectPtr CXMLConfig::GetNodeset(const xmlChar *xpath) 
{
	xmlXPathContextPtr context;	
	xmlXPathObjectPtr result;
	
	context = xmlXPathNewContext(m_doc);
	if (context == NULL) 
	{	
		throw XMLParserException("context is NULL.");
	}
	
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL) 
	{
		throw XMLParserException("xmlXPathEvalExpression return NULL."); 
	}
	
	if (xmlXPathNodeSetIsEmpty(result->nodesetval)) 
	{
		xmlXPathFreeObject(result);
		throw XMLParserException("nodeset is empty.");
	}
	
	return result;	
}

string CXMLConfig::GetFieldValueByPath(const char *szXpath)
{
	xmlXPathObjectPtr result = GetNodeset(BAD_CAST szXpath);
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];    
	string strRel = (const char*)xmlNodeGetContent(nodePtr);
	return strRel;
}

void CXMLConfig::SetFieldValueByPath(const string strValue, const char* szXpath)
{
	xmlXPathObjectPtr result = GetNodeset(BAD_CAST szXpath);
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];   
	xmlNodeSetContent(nodePtr, BAD_CAST strValue.c_str());
}

bool CXMLConfig::SaveBakConfigFile()
{
	xmlDocPtr doc = xmlReadFile(m_strFilename.c_str(),"UTF-8",XML_PARSE_RECOVER);  
	string strBakFilename = m_strFilename.substr(0,m_strFilename.length()-4);
	strBakFilename += "_bak.xml";
	int nRel = xmlSaveFormatFileEnc(strBakFilename.c_str(),doc,"UTF-8",1);
	if (nRel == -1)
	{
		return false;
	}
	return true;
}

bool CXMLConfig::Save()
{
	if (m_doc == NULL || m_strFilename == "")
	{
		return false;
	}
	SaveBakConfigFile();
	int nRel = xmlSaveFormatFileEnc(m_strFilename.c_str(),m_doc,"UTF-8",1);
	if (nRel == -1)
	{
		return false;
	}
	return true;
}

bool CXMLConfig::Remove(const char *szXpath)
{
	xmlXPathObjectPtr result;
	string strRel;
	result = GetNodeset(BAD_CAST szXpath);
		
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
	xmlNodePtr tempNode = nodePtr->next;
	xmlUnlinkNode(nodePtr);
	xmlFreeNode(nodePtr);
	nodePtr = tempNode;
		
	return Save();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -