libxml2 を使用して、作成中のプログラムの構成情報を含む XML ファイルを c で作成および読み取ります。プログラムは独自の構成ファイルを作成します (または、別のプログラムが構成ファイルを送信し、構成ファイルに基づいてプログラムを実行するように要求します)。そのため、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 ドキュメントから整数を取得し、失敗した場合は、プログラムがクラッシュしたり燃えたりしないようにデフォルト値を入力します。
そこで、読み取り機能と書き込み機能を 1 つにまとめる方法を試してみたいと思います。私のサンプル struct config-data は、構成構造体に実際にある値の数に比べて小さいので、それらを組み合わせることで、すべてを簡単に追跡できます。
そこで、こんなことを考えていました。
int openXMLvalue(X, Y, Z, readOrWrite, defaultValue, value);
親ノードはどこにありX, Y, Z
ますが、3 つより多い場合も少ない場合もあります。
これを行う方法についてのアイデアはありますか?たぶん、ある種の配列を作成しますか?