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

📄 xmlconfig.cpp

📁 介绍用Java解析网络数据的三种特殊方法
💻 CPP
字号:
// XMLConfig.cpp: implementation of the CXMLConfig class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "XMLConfig.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CXMLConfig::CXMLConfig(const char* szXmlFilename)
{
	m_strFilename = szXmlFilename;
	xmlNodePtr curNodePtr;  //定义结点指针
	
	m_doc = xmlReadFile(szXmlFilename,"GB2312",XML_PARSE_RECOVER);  //解析文件 
	if (m_doc == NULL)
	{
		fprintf(stderr,"Document not parsed successfully. \n"); 	
		xmlFreeDoc(m_doc); 
		exit(1);
	}
	curNodePtr = xmlDocGetRootElement(m_doc);  //确定文档根元素
	
	/*检查确认当前文档中包含内容*/ 
	if (curNodePtr == NULL)
	{
		fprintf(stderr,"empty document\n"); 
		xmlFreeDoc(m_doc); 
		exit(1);
	}
}

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

int CXMLConfig::code_convert(char* from_charset, char* to_charset, char* inbuf,
				 int inlen, char* outbuf, int outlen)
{
	iconv_t cd;
	char** pin = &inbuf;   
	char** pout = &outbuf;

	cd = iconv_open(to_charset,from_charset);   
	if(cd == 0)
		return -1;
	memset(outbuf,0,outlen);   
	if(iconv(cd,(const char**)pin,(unsigned int *)&inlen,pout,(unsigned int*)&outlen)
		== -1)
		return -1;   
	iconv_close(cd);
	return 0;   
}

char* CXMLConfig::u2g(char *inbuf)   
{
	int nOutLen = 2 * strlen(inbuf) + 1;
	char* szOut = (char*)malloc(nOutLen);
	
	if (-1 == code_convert("utf-8","gb2312",inbuf,strlen(inbuf),szOut,nOutLen))
	{
		free(szOut);
		szOut = NULL;
	}
	return szOut;
}   

char* CXMLConfig::g2u(char *inbuf)   
{
	int nOutLen = 2 * strlen(inbuf) + 1;
	char* szOut = (char*)malloc(nOutLen);
	
	if (-1 == code_convert("gb2312","utf-8",inbuf,strlen(inbuf),szOut,nOutLen))
	{
		free(szOut);
		szOut = NULL;
	}
	return szOut;
}   

xmlXPathObjectPtr CXMLConfig::get_nodeset(const xmlChar *xpath) 
{
	xmlXPathContextPtr context;	
	xmlXPathObjectPtr result;
	
	context = xmlXPathNewContext(m_doc);
	if (context == NULL) 
	{	
		fprintf(stderr,"context is NULL\n");
		return NULL; 
	}
	
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL) 
	{
		fprintf(stderr,"xmlXPathEvalExpression return NULL\n"); 
		return NULL;  
	}
	
	if (xmlXPathNodeSetIsEmpty(result->nodesetval)) 
	{
		xmlXPathFreeObject(result);
		fprintf(stderr,"nodeset is empty\n");
		return NULL;
	}
	
	return result;	
}

string CXMLConfig::getXmlString(const char *szXpath)
{
	xmlXPathObjectPtr result;
	string strRel;
	
	result = get_nodeset(BAD_CAST szXpath);

	if (result == NULL) 
	{
		fprintf(stderr,"xmlXPathEvalExpression return NULL\n"); 
		return NULL;  
	}
	
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;

	//查出符合xpath的节点集合
	if (xmlXPathNodeSetIsEmpty(nodeSetPtr)) 
	{
		xmlXPathFreeObject(result);
		fprintf(stderr,"nodeset is empty\n");
		return NULL;
	}
	
	//查出节点集合中唯一节点的内容值
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];    
	strRel = (const char*)xmlNodeGetContent(nodePtr);
	return strRel;
}

int CXMLConfig::getXmlInt(const char* szXpath)
{
	xmlXPathObjectPtr result;
	int iRel;
	
	result = get_nodeset(BAD_CAST szXpath);

	if (result == NULL) 
	{
		fprintf(stderr,"xmlXPathEvalExpression return NULL\n"); 
		return NULL;  
	}
	
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;

	//查出符合xpath的节点集合
	if (xmlXPathNodeSetIsEmpty(nodeSetPtr)) 
	{
		xmlXPathFreeObject(result);
		fprintf(stderr,"nodeset is empty\n");
		return NULL;
	}
	
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];    
	iRel = atoi((const char*)xmlNodeGetContent(nodePtr));
	return iRel;
}

bool CXMLConfig::writeXmlString(const string strValue, const char* szXpath)
{
	xmlXPathObjectPtr result;
	
	result = get_nodeset(BAD_CAST szXpath);
	if (result == NULL) 
	{
		fprintf(stderr,"xmlXPathEvalExpression return NULL\n"); 
		return false;  
	}
	
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;

	//查出符合xpath的节点集合
	if (xmlXPathNodeSetIsEmpty(nodeSetPtr)) 
	{
		xmlXPathFreeObject(result);
		fprintf(stderr,"nodeset is empty\n");
		return false;
	}
	
	//查出节点集合中唯一节点的内容值
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];   
	xmlNodeSetContent(nodePtr, BAD_CAST strValue.c_str());
	return true;
}

bool CXMLConfig::writeXmlInt(const int iValue, const char* szXpath)
{
	xmlXPathObjectPtr result;
	
	result = get_nodeset(BAD_CAST szXpath);

	if (result == NULL) 
	{
		fprintf(stderr,"xmlXPathEvalExpression return NULL\n"); 
		return false;  
	}
	
	xmlNodeSetPtr nodeSetPtr = result->nodesetval;

	//查出符合xpath的节点集合
	if (xmlXPathNodeSetIsEmpty(nodeSetPtr)) 
	{
		xmlXPathFreeObject(result);
		fprintf(stderr,"nodeset is empty\n");
		return false;
	}
	
	//查处节点集合中唯一节点的内容值
	xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
	char* szBuffer =  new char[sizeof(int) + 1];
	itoa(iValue,szBuffer,10);
	xmlNodeSetContent(nodePtr, BAD_CAST szBuffer);
	delete szBuffer;
	return true;
}

bool CXMLConfig::saveConfigFile()
{
	if (m_doc == NULL || m_strFilename == "")
	{
		return false;
	}
	saveBakConfigFile();
	int nRel = xmlSaveFormatFileEnc(m_strFilename.c_str(),m_doc,"GB2312",1);
	if (nRel == -1)
	{
		return false;
	}
	return true;
}

bool CXMLConfig::saveBakConfigFile()
{
	if (m_doc == NULL || m_strFilename == "")
	{
		return false;
	}

	//将原xml文档的最后四位去掉加上_bak.xml就是备份文档的名字
	string strBakFilename = m_strFilename.substr(0,m_strFilename.length()-4);
	strBakFilename += "_bak.xml";
	int nRel = xmlSaveFormatFileEnc(strBakFilename.c_str(),m_doc,"GB2312",1);
	if (nRel == -1)
	{
		return false;
	}
	return true;
}

bool CXMLConfig::loadBakConfigFile()
{
	if (m_doc == NULL || m_strFilename == "")
	{
		return false;
	}
	//将原xml文档的最后四位去掉加上_bak.xml就是备份文档的名字
	string strBakFilename = m_strFilename.substr(0,m_strFilename.length()-4);
	strBakFilename += "_bak.xml";

	if (m_doc != NULL)
	{
		xmlFreeDoc(m_doc);
	}
	m_doc = xmlReadFile(strBakFilename.c_str(),"GB2312",XML_PARSE_RECOVER);  //解析文件 
	return true;
}

⌨️ 快捷键说明

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