Когда вы сериализуете свои классы в XML, каждый узел должен содержать некоторый идентификатор того, каков их тип времени выполнения.Для десериализации создайте std::unordered_map
, который сопоставляет эти идентификаторы типов с заводскими функциями для каждого типа.Это потребует, чтобы функции фабрики имели одинаковую сигнатуру, поэтому вам нужно будет извлечь все сериализуемые классы из общего интерфейса.Понизьте значение возврата фабричной функции во время выполнения в зависимости от идентификатора типа.Создайте сеттеры / геттеры для доступа к каждому атрибуту и значению, которое может иметь конкретный тип узла.
Если вы используете парсер DOM, все может быть немного проще, потому что у вас есть вся информация об узле, когда вы сталкиваетесь с ним,
С помощью синтаксического анализатора SAX вам придется создавать классы дочерних узлов и устанавливать атрибуты и значения для каждого узла, когда вы сталкиваетесь с ними.Ваш синтаксический анализатор XML должен разрешать обратные вызовы или виртуальные методы, которые могут быть переопределены, получать уведомления о новых атрибутах и узлах при чтении файла XML.
Или, если вы не возражаете тратить деньги,Самый простой выход - позволить кому-то сделать всю работу за вас.Я никогда не использовал Code Synthesis XSD , но он предназначен именно для того, что вы пытаетесь сделать.