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

📄 code_conv.cpp

📁 介绍用Java解析网络数据的三种特殊方法
💻 CPP
字号:
#include "stdafx.h"
#include <iconv.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <string>

#include "Code_Conv.h"

//代码转换:从一种编码转为另一种编码   
int 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;   
}

//UNICODE码转为GB2312码   
//成功则返回一个动态分配的char*变量,需要在使用完毕后手动free,失败返回NULL
char* 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;
}   

//GB2312码转为UNICODE码   
//成功则返回一个动态分配的char*变量,需要在使用完毕后手动free,失败返回NULL
char* 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 get_nodeset(xmlDocPtr doc, const xmlChar *xpath) 
{
	xmlXPathContextPtr context;	
	xmlXPathObjectPtr result;
	
	context = xmlXPathNewContext(doc);
	if (context == NULL) 
	{	
		printf("context is NULL\n");
		return NULL; 
	}
	
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL) 
	{
		printf("xmlXPathEvalExpression return NULL\n"); 
		return NULL;  
	}
	
	if (xmlXPathNodeSetIsEmpty(result->nodesetval)) 
	{
		xmlXPathFreeObject(result);
		printf("nodeset is empty\n");
		return NULL;
	}
	
	return result;	
}

string getXmlString(xmlDocPtr doc, const char *szXpath)
{
	xmlXPathObjectPtr result;
	string strRel;
	
	result = get_nodeset(doc,BAD_CAST szXpath);

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

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

int getXmlInt(xmlDocPtr doc, const char* szXpath)
{
	xmlXPathObjectPtr result;
	int iRel;
	
	result = get_nodeset(doc,BAD_CAST szXpath);

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

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

xmlDocPtr openXmlFile(const char* szXmlFilename)
{
	xmlDocPtr doc;   //定义解析文档指针 
	xmlNodePtr curNodePtr;  //定义结点指针
	
	doc = xmlReadFile(szXmlFilename,"GB2312",XML_PARSE_RECOVER);  //解析文件 
	if (doc == NULL ) 
	{
		fprintf(stderr,"Document not parsed successfully. \n"); 	
		xmlFreeDoc(doc); 
		exit(1);
	} 	
	curNodePtr = xmlDocGetRootElement(doc);  //确定文档根元素
	
	/*检查确认当前文档中包含内容*/ 
	if (curNodePtr == NULL)
	{
		fprintf(stderr,"empty document\n"); 
		xmlFreeDoc(doc); 
		exit(1);
	}
	
	/*在这个例子中,我们需要确认文档是正确的类型。“main”是在这个示例中使用文档的根类型。*/
	if (xmlStrcmp(curNodePtr->name, (const xmlChar *) "main")) 
	{ 
		fprintf(stderr,"document of the wrong type, root node != main"); 
		xmlFreeDoc(doc); 
		exit(1);
	} 
	return doc;
}

void closeXmlFile(xmlDocPtr doc)
{
	xmlFreeDoc(doc); 
}

⌨️ 快捷键说明

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