2012-04-30 43 views
0

我正在使用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

如何做到這一點任何想法?也許做一些類型的數組?

回答

0

我會做泛型讀寫函數來填充(或序列化)通用配置結構。

一個簡單的例子是使用get/set方法在內存中創建一個鍵/值結構。通用writeToXml函數只需創建包含值的鍵名稱的元素。

如果有擔保,可以改爲使用分層樹結構,也可以在讀取配置文件時添加一些驗證規則(一種簡單的方法是使用XML模式進行驗證)以驗證所需的配置值是否存在以及是有效的。

要添加,更改或刪除配置值,那麼就只需要以下步驟(注意,既不能讀或寫功能需要更新):

  • 決定配置文件
  • 更新現有的新格式配置文件
  • 更新中使用配置應用程序的任何地方重視
  • 可選更新驗證規則
0

由於配置文件的大小很大,我們切換到使用sqlite。然後我們創建了一個函數來讀取數據庫並創建一個XML表單,我們創建了一個讀取XML表單並填充數據庫的函數,並且使用函數來打印數據庫以填充和填充C結構體。認爲這會讓生活變得更容易。