C 结合XML配置函数的读写。
我使用libxml2创建和读取c语言中的XML文件,其中包含我正在编写的程序的配置信息。程序生成自己的配置文件(或者另一个程序向其发送配置文件,并要求程序根据配置文件运行),因此XML配置文件不需要非常容易让人阅读 这些配置文件包含很多值,而且非常长。现在我有一个函数生成XML文件,另一个函数读取XML文件。但是,无论何时更改write-XML函数,都需要同时更改read-XML函数因此没有实际的代码重复,但有一些非常接近(即坏)并且由于配置文件太长,因此尝试确保所有内容都是读写相同的内容是相当繁琐的 这是当前设置C 结合XML配置函数的读写。,c,xml,configuration,libxml2,C,Xml,Configuration,Libxml2,我使用libxml2创建和读取c语言中的XML文件,其中包含我正在编写的程序的配置信息。程序生成自己的配置文件(或者另一个程序向其发送配置文件,并要求程序根据配置文件运行),因此XML配置文件不需要非常容易让人阅读 这些配置文件包含很多值,而且非常长。现在我有一个函数生成XML文件,另一个函数读取XML文件。但是,无论何时更改write-XML函数,都需要同时更改read-XML函数因此没有实际的代码重复,但有一些非常接近(即坏)并且由于配置文件太长,因此尝试确保所有内容都是读写相同的内容是相当
struct config_data
{
// category one
int X
int Y
// category two
int Z
int A
}
int makeXMLsheet(char* fileout)
{
xmlDocPtr doc = NULL; /* document pointer */
xmlNodePtr root_node = NULL; /* node pointers */
LIBXML_TEST_VERSION;
doc = xmlNewDoc((xmlChar*) "1.0");
root_node = xmlNewNode(NULL, BAD_CAST "configuration_file");
xmlDocSetRootElement(doc, root_node);
// catogory one
xmlNodePtr category_one = xmlNewChild(root_node, NULL, BAD_CAST "category_one", NULL);
xmlNewChild(category_one, NULL, BAD_CAST "x", BAD_CAST "12345");
xmlNewChild(category_one, NULL, BAD_CAST "y", BAD_CAST "1");
// catogory two
xmlNodePtr category_two = xmlNewChild(root_node, NULL, BAD_CAST "category_two", NULL);
xmlNewChild(category_two, NULL, BAD_CAST "Z", BAD_CAST "12345");
xmlNewChild(category_two, NULL, BAD_CAST "A", BAD_CAST "1");
xmlSaveFormatFileEnc(fileout, doc, "UTF-8", 1);
xmlFreeDoc(doc);
xmlCleanupParser();
return 0;
}
int readXMLsheet(char* filename,struct *config_data)
{
xmlDocPtr doc = getdoc(filename);
config_data->X = getIntegerFromXML(0,doc,(xmlChar*)"//configuration_file/category_one/X");
config_data->Y = getIntegerFromXML(0,doc,(xmlChar*)"//configuration_file/category_one/Y");
config_data->Z = getIntegerFromXML(0,doc,(xmlChar*)"//configuration_file/category_two/Z");
config_data->A = getIntegerFromXML(0,doc,(xmlChar*)"//configuration_file/category_two/a");
xmlFreeDoc(doc);
return 0;
}
在哪里
int getIntegerFromXML(int defaultValue, xmlDocPtr doc, xmlChar *xpath)
按照其名称执行,并从具有xpath位置的打开的XML文档中获取一个整数,如果失败,则使用默认值填充该整数,以便程序不会崩溃和烧坏
因此,我想尝试一下如何将读写函数组合成一个函数。与配置结构中实际包含的值相比,我的示例结构配置数据非常小,因此组合它们将使跟踪所有内容变得更加容易
所以我在想这样的事情
int openXMLvalue(X, Y, Z, readOrWrite, defaultValue, value);
其中X,Y,Z
是父节点,但可能多于或少于3个
有什么办法吗?可能会制作某种类型的数组?我会制作通用读写函数,用于填充(或序列化)通用配置结构 一种简化的情况是使用get/set方法在内存中创建键/值结构。通用writeToXml函数只需创建包含值的键名的元素 如果有必要,可以使用分层树结构来代替,并且可能在读取配置文件时添加一些验证规则(一个简单的规则是使用XML模式进行验证),以验证所需的配置值是否存在并且有效 添加、更改或删除配置值只需要以下步骤(请注意,读或写函数都不需要更新):
- 确定配置文件的新格式
- 更新现有配置文件
- 使用配置值更新应用程序中的任何位置
- 可选地更新验证规则