私は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
これを行う方法上の任意のアイデアは?たぶん配列の型を作るのだろうか?