Здравствуйте, Друзья!
Ломаю голову над такой задачкой:
нужно написать приложение, которое запрос в формате XML переваривала бы в определенный протокол.
XML запрос представляет из себя "команду" вида:
<AddNew>
<User name="UserName" age="UserAge" address="UserAddress"/>
<Hardware id="HardwareID" type="HardwareType" power="HardwarePower" count="HardwareCount"/>
<Linkage user="UserName" hardware="HardwareID"/>
</AddNew>
или
<UpdateOld>
<User name="UserName" age="UserAge" address="UserAddress"/>
<Hardware id="HardwareID" type="HardwareType" power="HardwarePower" count="HardwareCount"/>
<Linkage user="UserName" hardware="HardwareID"/>
</UpdateOld>
Протокол переваривает эти запросы в следующий вид.
Команда AddNew, к примеру, превращается в запрос:
RQ_ADDNEW_USER
{
char UserName[20];
byte UserAge;
char Addres[250];
}
RQ_ADDNEW_HARDWARE
{
UINT HardwareID;
BYTE HardwareType;
UINT HardwarePower;
BYTE HardwareCount;
}
RQ_ADDNEW_LINKAGE
{
char UserName[20];
UINT HardwareID;
}
Посоветуйте, пожалуйста, как организовать архитектуру приложения?
Планируется использовать XML парсер TinyXML. Язык C++.
Задача осложняется тем, что наличие некоторых атрибутов элементов XML запроса необязательно, других — обязательно, то есть необходимо выполнять проверки на наличие определенных элементов.
Мне видится такая картина:
1. объект класса CRequestFactory — получает строку XML запроса. Парсит ее. В зависимости от корневого элемента запроса <AddNew> или <UpdateOld> создает класс соответствующего протокольного запроса CAddRequest или CUpdateRequest, соответственно, и отдает им распарсенные данные, а также указатель на объект-передатчик запроса на сервер.
2. объекты классов CAddRequest и CUpdateRequest на основе распарсенных данных заполняют свои внутренние члены-данные и проверяют их по необходимым условиям (наличие элементов, значения элементов). В случае, если наполнение запроса прошло успешно, объект вызывает функцию объекта-передатчика для отправки запроса на сервер, например:
sender->SendRequest(RQ_RQ_ADDNEW_USER, this->UserName, this->UserAge, this->Addres);
Проблема такой реализации в том, что при большом наличии атрибутов элементов и необходимости сложных преобразований типов этих атрибутов, функции классов CAddRequest и CUpdateRequest становятся очень громоздкими. Становится сложно изменять запросы. Хочется как-то упростить реализацию.
Буду благодарен любым советам.