gSoap XML-привязка данных - возможно ли автоматическое выполнение функций чтения / записи?
Я использую несколько файлов XML, каждый со своим собственным классом обработчика. Каждый класс имеет функции loadXML и exportXML, которые идентичны, но имеют одну строку. Я хотел бы определить метод, в котором мне не нужно копировать и вставлять каждый раз, когда я создаю новый класс обработчика для нового XML.
Для каждого файла я только меняю:
if(soap_read__gt__Library(&soap, &library) != SOAP_OK)
а также
if(soap_write__gt__Library(&soap, &library) != SOAP_OK)
где gt - пространство имен, а Library - корневой узел. Каждый новый XML-файл будет иметь свое пространство имен и корневой узел. Это теперь перед компиляцией, есть ли в любом случае автоматическая замена функций загрузки / экспорта XML каждого класса их уважаемыми пространствами имен и корневыми узлами?
Например, я создаю новый XML с тестом пространства имен и корневым узлом devConfig. Я хотел бы метод, который заменяет load / exportXML с soap_read__test__devConfig и soap_write_test__devConfig.
void LoadXML(struct soap& soap, _gt__Library& library, const string& strXMLPath)
{
ifstream fstreamIN(strXMLPath);
soap.is = &fstreamIN;
// calls soap_begin_recv, soap_get__gt__Library and soap_end_recv
if(soap_read__gt__Library(&soap, &library) != SOAP_OK)
{
std::cout << "soap_read__gt__Library() failed" << std::endl;
throw 1;
}
// patch
if(_setmode(_fileno(stdin), _O_TEXT) == -1)
{
std::cout << "_setmode() failed" << std::endl;
throw 1;
}
// ~patch
}
void exportXML(struct soap& soap, _gt__Library& library, const string& strXMLPath)
{
soap_set_omode(&soap, SOAP_XML_INDENT);
ofstream fstreamOUT(strXMLPath);
soap.os = &fstreamOUT;
// calls soap_begin_send, soap_serialize, soap_put and soap_end_send
if(soap_write__gt__Library(&soap, &library) != SOAP_OK)
{
std::cout << "soap_write__gt__Library() failed" << std::endl;
throw 1;
}
}
1 ответ
Возможно, не самое чистое решение, но я полагаю, вы могли бы использовать макрос, например так:
#define loadXML(soap, gt_name, library, namespaces, root, strXMLPath) \
ifstream fstreamIN(strXMLPath); \
soap.is = &fstreamIN; \
soap_set_namespaces(soap, namespaces); // namespace table \
if(soap_begin_recv(soap) || \
soap_get_##gt_name(soap, library, root, NULL)) || \
soap_end_recv(soap)) \
{ \
std::cout << "soap_read__gt__Library() failed" << std::endl; \
throw 1; \
} \
etc.
и разверните его, чтобы реализовать нужные вам операции:
loadXML(&soap, gt__library, &library, namespaces, "some-root", strXMLPath)