使用libxml读取分析配置文件

前端之家收集整理的这篇文章主要介绍了使用libxml读取分析配置文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

配置文件示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <Day>7</Day>
  <partitions>
    <partition>
      <ip>192.168.2.213</ip>
      <port>5730</port>
    </partition>
    <partition>
      <ip>192.168.2.230</ip>
      <port>9003</port>
    </partition>
  </partitions>
</config>

首先定义存储信息的结构体:
typedef struct _partition {
	char ip[STRING_SIZE_MAX];
	int port;
} partition_t;

typedef struct _config {
	int day;
	int partitions_count;
	partition_t p[MAX];
} config_t;
然后就可以用linxml中的函数封装接口了,主要引用的头文件有:
#include "xmlwriter.h"
#include "xmlreader.h"
#include "parser.h"

接口封装:
int load_config(config_t *c,const char *file) {
	int ret = 0;
	xmlDocPtr doc;
	xmlNodePtr cur;
	xmlChar *key = NULL;
	doc = xmlParseFile(file);
	if(doc == NULL) {
		return -1;
	}
	cur = xmlDocGetRootElement(doc);//求根节点
	if(cur == NULL) {
		gerr("root element get fail.");
		xmlFreeDoc(doc);
		return -1;
	}
	//判断根节点是否为config
	if(xmlStrcmp(cur->name,(const xmlChar *)("config")) != 0) {
		gerr("root element error:%s",(const char *)(cur->name));
		xmlFreeDoc(doc);
		return -1;
	}
	//进到孩子节点
	cur = cur->xmlChildrenNode;
	while(cur != NULL) {
		if(xmlStrcmp(cur->name,(const xmlChar *)("Day")) == 0) {
			key = xml_node_strval(doc,cur);
			if(key != NULL) {
				c->day = atoi((char *)key);
				xmlFree(key);
				gdebug("%s=%d",(const char *)cur->name,c->day);
			}
		} else if(xmlStrcmp(cur->name,(const xmlChar *)("partitions")) == 0) {
			ret = load_partitions(c,doc,cur);
			if(ret != 0) {
				gdebug("parse device list fail.");
				return -1;
			}
		} 
		//遍历兄弟节点
		cur = cur->next;
	}
	xmlFreeDoc(doc);
	return 0;
}
static int load_partition(partition_t *pt,xmlDocPtr doc,xmlNodePtr cur) {
	int ret=0;
	xmlChar *key;
	cur = cur->xmlChildrenNode;
	while(cur != NULL) {
		if(xmlStrcmp(cur->name,(const xmlChar *)("ip")) == 0) {
			key = xml_node_strval(doc,cur);
			if(key != NULL) {
				strncpy(pt->ip,(const char *)key,sizeof(pt->ip));
				xmlFree(key);
				gdebug("%s=%s",pt->ip);
			}
		} else if(xmlStrcmp(cur->name,(const xmlChar *)("port")) == 0) {
			key = xml_node_strval(doc,cur);
			if(key != NULL) {
				pt->port = atoi((char *)key);
				xmlFree(key);
				gdebug("%s=%d",pt->port);
			}
		} 
		cur = cur->next;
	}
	return 0;
}

static int load_partitions(config_t *c,xmlNodePtr cur) {
	int ret = 0;
	int i = 0;
	cur = cur->xmlChildrenNode;
	while(cur != NULL) {
		if(xmlStrcmp(cur->name,(const xmlChar *)("partition")) == 0) {
			ret = load_partition(&c->p[i++],cur);
			if(ret != 0) {
				gerr("partition load failure.");
				return -1;
			}
			gdebug("partition load done.");
		}
		cur = cur->next;
	}
	return 0;
}
原文链接:https://www.f2er.com/xml/295924.html

猜你在找的XML相关文章