我正在使用libxml2來創建和讀取包含我正在編寫的程序的配置信息的c中的XML文件。該程序創建自己的配置文件(或者其他程序向其發送配置文件並要求程序根據配置文件運行),因此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文檔整數,如果再失敗就用默認值填充它,以便程序不會崩潰並燒燬。
所以我想嘗試一些如何將讀寫功能合併爲一個。我的示例struct config-data與我在配置結構中實際擁有的值的數量相比是微小的,因此將它們組合起來可以更輕鬆地跟蹤一切。
所以我在想這樣的事情。
int openXMLvalue(X, Y, Z, readOrWrite, defaultValue, value);
其中X, Y, Z
是父節點,但有可能會大於或小於3
如何做到這一點任何想法?也許做一些類型的數組?