我正在使用 libxml2 在 c 中创建和读取包含我正在编写的程序的配置信息的 XML 文件。该程序制作自己的配置文件(或另一个程序向其发送配置文件并要求程序根据配置文件运行),因此 XML 配置文件不需要非常容易让人阅读。
这些配置文件包含很多值并且非常长。所以现在我有一个生成 XML 文件的函数和另一个读取 XML 文件的函数。但是,任何时候我更改写入 XML 函数都比我需要更改读取 xml 函数。所以没有实际的代码重复,而是非常接近的东西(即BAD),并且由于配置文件太长,尝试确保所有内容都在读取和写入相同的东西是相当乏味的。
这是当前的设置。
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 文档中获取一个整数,如果它失败了,它会用默认值填充它,这样程序就不会崩溃和烧毁。
所以我想尝试一些如何将读取和写入功能合二为一。与我在配置结构中实际拥有的值的数量相比,我的示例结构 config-data 很小,因此将它们组合起来将使跟踪一切变得更加容易。
所以我在想这样的事情。
int openXMLvalue(X, Y, Z, readOrWrite, defaultValue, value);
父节点在哪里X, Y, Z
,但可能多于或少于 3 个。
关于如何做到这一点的任何想法?也许制作某种类型的数组?