📄 xmlconfig.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 + -