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)
Другие вопросы по тегам