C语言xml文件存储数据文件(一)

C语言xml文件存储数据文件(一)————————————————版权声明:本文为CSDN博主「jack8126」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/jack8126/article/details/117004179本文,摘抄的,未验证过,纯属保存留用,请看原作者。c语言读取xml配置文件c语言要实现读取xml配置文件的功能。需要先编译libxml2库。1、编译libxml2库libxml2库从网络下载得到,这里下载的文件是:

大家好,又见面了,我是你们的朋友全栈君。

————————————————
版权声明:本文为CSDN博主「jack8126」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jack8126/article/details/117004179

本文,摘抄的,未验证过,纯属保存留用,请看原作者。

c语言读取xml配置文件
c语言要实现读取xml配置文件的功能。需要先编译libxml2库。

1、编译libxml2库
libxml2库从网络下载得到,这里下载的文件是:libxml2-sources-2.9.9.tar.gz

1.1、将libxml2文件拷贝到ubuntu系统下并解压
切换到libxml2库存在的路径下。

执行解压缩命令:
tar -zxvf libxml2-sources-2.9.9.tar.gz
在这里插入图片描述
解压之后并切换到libxml2库路径下。
在这里插入图片描述
1.2、配置libxml2库
执行配置命令
./configure –prefix=/mnt/work/test/test/c/output
在这里插入图片描述
1.3、编译libxml2库
执行编译命令:make
在这里插入图片描述
编译过程中出现出错
libxml.c:14:20: fatal error: Python.h: No such file or directory

需要安装python,执行命令:
sudo apt-get install python-dev
在这里插入图片描述
安装完python-dev之后,再次编译成功。
执行make install执行安装在这里插入图片描述
安装完成之后,查看output路径下,增加了相关的文件。
在这里插入图片描述

2、xml配置文件
xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<bmp_para>
  <para id="1">
     <width>1920</width>
     <height>1080</height>
     <bit>3</bit>
     <blue>0</blue>
     <green>0</green>
     <red>255</red>     
  </para>
</bmp_para>

3、c代码读取xml文件
c实现代码如下:

/******************************************************* * file:testReadXml.c * date:2021-05-18 * version:1.0.0.1 * author:jack8126 * description: read para from xml file *******************************************************/
#include <stdio.h>
#include <assert.h>
 
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
 
#define DEFAULT_XML_FILE "test.xml"
 
//解析para字段,提取出width,height,bit,red,green,blue参数
static int parse_bmp(xmlDocPtr doc, xmlNodePtr cur)
{ 
   
    assert(doc || cur);
    xmlChar *key;
 
    cur = cur->xmlChildrenNode;
    while (cur != NULL) { 
   
	    //获取width
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"width"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("width: %s\r\n", key);
	        xmlFree(key);
	    }
	    //获取height
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"height"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("height: %s\r\n", key);
	        xmlFree(key);
	    }
	    //获取bit
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"bit"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("bit: %s\r\n", key);
	        xmlFree(key);
	    }
	    //获取 blue
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"blue"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("blue: %s\r\n", key);
	        xmlFree(key);
	    }
	    //获取 green
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"green"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("green: %s\r\n", key);
	        xmlFree(key);
	    }
	    //获取 red
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"red"))) { 
   
	        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
	        printf("red: %s\r\n", key);
	        xmlFree(key);
	    }

	    cur = cur->next;
    }
    return 0;
}
 
static int parse_para(const char *file_name)
{ 
   
	assert(file_name);

	xmlDocPtr doc;   //xml整个文档的树形结构
	xmlNodePtr cur;  //xml节点
	xmlChar *id;     //phone id

	//获取树形结构
	doc = xmlParseFile(file_name);
	if (doc == NULL) { 
   
		fprintf(stderr, "Failed to parse xml file:%s\n", file_name);
		goto FAILED;
	}

	//获取根节点
	cur = xmlDocGetRootElement(doc);
	if (cur == NULL) { 
   
		fprintf(stderr, "Root is empty.\n");
		goto FAILED;
	}

	if ((xmlStrcmp(cur->name, (const xmlChar *)"bmp_para"))) { 
   
		fprintf(stderr, "The root is not bmp_para.\n");
		goto FAILED;
	}

	//遍历处理根节点的每一个子节点
	cur = cur->xmlChildrenNode;
	while (cur != NULL) { 
   
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"para"))) { 
   
			id = xmlGetProp(cur, "id");
			printf("id:%s\r\n",id);
			parse_bmp(doc, cur);
		}
		cur = cur->next;
	}
	xmlFreeDoc(doc);
	return 0;
	FAILED:
	if (doc) { 
   
		xmlFreeDoc(doc);
	}
	return -1;
}
 
int main(int argc, char*argv[])
{ 
   
    char cFileNameRead[64] = { 
   0}; 

	if(argc < 2)
	{ 
   
		printf("please input like this:\r\n");
		printf("./testReadXml.bin test.xml \r\n");
		printf("test.xml --------------- input xml file \r\n");
		return -1;
	}

    sprintf(cFileNameRead,"%s",argv[1]);
	printf("cFileNameRead=%s\r\n",cFileNameRead);

	if (parse_para(cFileNameRead) != 0) { 
   
		fprintf(stderr, "Failed to parse bmp para.\n");
		return -1;
	}

	return 0;
}

4、编译程序
执行编译命令
gcc -g testReadXml.c -o testReadXml.bin -I /mnt/work/test/test/c/output/include/libxml2/ -L /mnt/work/test/test/c/output//lib/ -lxml2
在这里插入图片描述
gcc编译时,需要制定libxml2库的位置和头文件的位置。

5、执行程序
执行命令如下:
./testReadXml.bin test.xml

执行效果如下:
在这里插入图片描述
如上图打印信息,可以通过libxml读取到test.xml文件中的关于bmp的宽高和红绿蓝参数。

参考链接:
https://blog.csdn.net/qingzhuyuxian/article/details/82596386
————————————————
版权声明:本文为CSDN博主「jack8126」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jack8126/article/details/117004179

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157864.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 缓冲区溢出攻击实验「建议收藏」

    缓冲区溢出攻击实验「建议收藏」又一个计系系统的实验。

    2022年7月12日
    18
  • 解决Windows有网络连接但是显示“无Internet”的问题

    引子最近电脑莫名其妙地出现了可以正常上网,但是任务栏上的网络图标显示“无Internet”的问题。如果不使用微软账户的话,这个问题其实没什么影响,但是如果使用微软账户,这个问题会导致所有与微软账户相关的软件无法登录,比如Microsoft365和Outlook邮箱。在网上找了很多帖子都没有解决,最终通过相关帖子的学习提供一种解决该问题的思路,如果有用,请不要吝惜你的点赞????如果你有更好的解决方案,欢迎评论分享思路要想知道这个问题的原因,首先我想到的是需要了解Windows网络感知的原理。通过查

    2022年4月7日
    377
  • 下载怪兽模板(TemplateMonster)的方法「建议收藏」

    下载怪兽模板(TemplateMonster)的方法「建议收藏」提到Flash网站模板,就不得不提起“怪兽模板(TemplateMonster)”这个品牌,TM的每件作品都堪称佳作,他们不仅在创作,更是在引领时代潮流,可以说,TM的作品是每

    2022年7月1日
    41
  • linux抓取snmp trap告警命令,linux snmptrap的发送与接收

    linux抓取snmp trap告警命令,linux snmptrap的发送与接收linuxsnmptrap的发送与接收由于需要管理服务器的一些参数,比如CPU使用率,IOwait之类的指标,管理方通过snmpwalk进行五分钟一次对受管服务器的轮询。此类指标为业务指标,是必须了解的一些参数,另需要有告警指标信息。但由于告警信息一般是由受管服务器进行主动告警,这时候就不能通过管理方主动使用snmpwalk来进行,而是由受管服务器通过snmptrap进行。以下是对双方进行snm…

    2022年8月20日
    17
  • vue双向绑定失效_vue 跨域

    vue双向绑定失效_vue 跨域v-for渲染一个数组到视图上,对这个数组进行如下操作时会导致双向绑定失败无法在视图上渲染最新的数据:1.对这个数组的数组项整个进行修改Item:[{name:’小王’,age:19,},{name:’小张’,age:22}]this.Item[0]={name:’小K’,age:98}此时发现视图上渲染的第0项是没有改变的,但是打印出来的Item是已经修改到的为什么说整个数组项,如果对数组内对象的某个属性值修改,视图上还是能监听到的2.对这个数组进行添加或删除操作this.Ite

    2025年11月17日
    3
  • 基于朴素贝叶斯的文本分类算法「建议收藏」

    基于朴素贝叶斯的文本分类算法「建议收藏」基于朴素贝叶斯的文本分类算法摘要:常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用。本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模型(MM),实现了可运行的代码,并进行了一些数据测试。关键字:朴素贝叶斯;文本分类第1章贝叶斯原理1.1贝叶斯公式[1]已知某条件概率,如何得到两个事件交换后的概率,也就…

    2022年5月17日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号