标签:移动 stat 文件名 children 打开文件 名称 fprintf 属性 etc
1:环境配置
包含目录下 包含include libxml2_64\include 包含xmllib库路径 libxml2_64 注意 libxml分为32位程序和64位程序,这两种的环境需要的lib不一样,需要分别下载
需要使用库 libxml2.lib
注意:往xml文件中写入数据只能是utf-8类型的 所以当往xml文件中输入中文时候需要把GBK2312转换为utf-8,解析的时候需要把utf8转换为GBK2312,使用的函数
static int GB2312ToUtf8(const char* gb2312, char* utf8)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8, len, NULL, NULL);
if(wstr) delete[] wstr;
return len;
}
//UTF-8到GB2312的转换
static int Utf8ToGB2312(const char* utf8, char* gb2312)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, gb2312, len, NULL, NULL);
if(wstr) delete[] wstr;
return len;
}
使用xml文件
创建xml文件并写入相应节点
int write_xml(char *filename,char*node,char*data) //filename:: xml文件名 node::写入的节点名 data:写入的节点数据
{
xmlDocPtr doc;
doc = xmlReadFile(filename, "GB2312", XML_PARSE_NOBLANKS);
if(doc == NULL) //文件不存在 创建一个新文件
{
xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");
//设置根节点
xmlDocSetRootElement(doc,root_node);
xmlNewTextChild(root_node, NULL, BAD_CAST node, BAD_CAST data);
xmlSaveFormatFileEnc(filename,doc,"GB2312",1);
xmlFreeDoc(doc);
return 0;
}
xmlNodePtr cur;
cur = xmlDocGetRootElement(doc);
if(cur == NULL)
{
xmlFreeDoc(doc);
return -1;
}
xmlNewTextChild(cur, NULL, BAD_CAST node, BAD_CAST data);
int nRel = xmlSaveFormatFileEnc(filename,doc,"GB2312",1);
xmlFreeDoc(doc);
return 0;
}
解析xml文件
xmlChar* ReadXml(char* filename,char* node_content) //filename:xml文件名 node_content:xml节点的节点名
{
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr node; //定义结点指针(你需要它为了在各个结点间移动)
xmlKeepBlanksDefault(0); //避免将空格当作一个节点
doc = xmlParseFile(filename);
if(doc == NULL) //xml文件不存在
{
fprintf(stderr,"parse error\n");
return NULL;
}
node = xmlDocGetRootElement(doc);
if(node == NULL)
{
fprintf(stderr, "doc has no content\n");
}
char str[256]={0};
node = node->children;
while(node != NULL)
{
if(xmlStrcmp(node->name,(const xmlChar*)node_content)==0)
{
return xmlNodeGetContent(node);
}
node = node->next;
}
xmlFreeDoc(doc);
return NULL;
}
注意:xml文件原型其实是个二叉树,用链表组成的,使用的时候首先打开文件,找到头节点,然后在往头结点添加新节点和给新节点添加属性,具体不一一列举
特别注意:xml文件的节点名称不能是数字,必须是字母(字母后面可以接数字),否则解析xml文件时不能识别该节点
标签:移动 stat 文件名 children 打开文件 名称 fprintf 属性 etc
原文地址:https://www.cnblogs.com/jameflight/p/9806547.html