gpt4 book ai didi

结合XML配置函数的读写。

转载 作者:行者123 更新时间:2023-11-30 18:00:34 25 4
gpt4 key购买 nike

我正在使用 libxml2 在 c 语言中创建和读取 XML 文件,其中包含我正在编写的程序的配置信息。该程序生成自己的配置文件(或者另一个程序向其发送配置文件并要求该程序根据配置文件运行),因此 XML 配置文件不需要非常容易让人阅读。

这些配置文件包含很多值并且非常长。现在我有一个生成 XML 文件的函数和另一个读取 XML 文件的函数。然而,每当我更改写入 XML 函数时,我都需要更改读取 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 模式进行验证)来验证所需的配置值是否存在并且是有效。

要添加、更改或删除配置值,只需执行以下步骤(请注意,读取或写入功能都不需要更新):

  • 决定配置文件的新格式
  • 更新现有配置文件
  • 使用配置值更新应用中的任何位置
  • 可以选择更新验证规则

关于结合XML配置函数的读写。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com