2012-04-30 8 views
0

私はlibmml2を使って、私が書いているプログラムの構成情報を含むXMLファイルを作成して読み込みます。プログラムは独自の設定ファイルを作成します(または、別のプログラムが設定ファイルを送信し、設定ファイルに基づいてプログラムを実行するように要求します)ので、XML設定ファイルは人間が読むのが簡単である必要はありません。XML構成関数の読み書きを組み合わせる。

これらの設定ファイルには多くの値が含まれていて、実際には長いです。今はXMLファイルを作成する関数とXMLファイルを読み込む関数があります。しかし、私はread xml関数を変更する必要があるよりも、いつでも書き込みXML関数を変更します。 実際のコードの重複はありませんが、実際には近いもの(BAD)があり、設定ファイルが長すぎるため、すべてが同じものを読み書きしていることを確認するのは面倒です。

これは現在の設定です。その名前が言うとXPathの場所を持っている開いたXMLドキュメントから整数を取得するよう

int getIntegerFromXML(int defaultValue, xmlDocPtr doc, xmlChar *xpath) 

がいて、それに失敗した場合には、デフォルト値でそれを埋め

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; 
} 

ようにプログラムはクラッシュせず、焼き付けられません。

ですから、読み書き機能をどのように組み合わせるかを考えてみたいと思います。私のサンプルの構造体config-dataは、実際に私のコンフィギュレーション構造体に含まれている値の数と比べると小さいので、それらを組み合わせることで、すべてをより簡単に追跡することができます。

私はこのようなことを考えていました。

int openXMLvalue(X, Y, Z, readOrWrite, defaultValue, value); 
X, Y, Zが親ノードである

が、あるかもしれませんより多くても少なくても3

これを行う方法上の任意のアイデアは?たぶん配列の型を作るのだろうか?

答えて

0

一般的な構成構造を取り込む(またはシリアル化する)一般的な読み書き機能を作成します。

簡略化されたケースは、get/setメソッドを使用してメモリ内にキー/値構造体を作成することです。一般的なwriteToXml関数は、単に値を含むキー名を持つ要素を作成します。

保証があれば、代わりに階層ツリー構造を使用し、構成ファイル(単純に検証用のXMLスキーマを使用する)を読み込むときにいくつかの検証ルールを追加して、必要な構成値が存在することを検証し、有効です。追加、変更または設定値を削除するには

は、その後のみ、以下の手順を(どちらも読み取りまたは書き込み機能は、更新が必要なことに注意してください)必要になります。

  • 設定ファイルの新しいフォーマットを決定し、既存の更新コンフィギュレーションファイル
  • アップデートに構成を使用して、アプリケーション内の任意の場所には
  • 必要に応じて更新検証ルール
0

構成ファイルのサイズが大きいため、sqliteを使用しました。次に、データベースを読み込んでXMLシートを作成する関数を作成し、XMLシートを読み込んでデータベースを作成し、データベースを印字してC構造体を埋め込む関数を作成する関数を作成しました。これは人生をはるかに簡単にするだろうと思う。

関連する問題