Мне нужно написать приложение C++ (используя Qt Framework для графического интерфейса пользователя), которое может редактировать данные, хранящиеся в файлах xml, описанных файлом схемы xsd. Есть ли инструмент для преобразования схемы xsd в классы C++?





Altova XML Spy может генерировать C++ из XSD, он коммерческий, но есть 30-дневная бесплатная пробная версия, если вы хотите попробовать его.
Мне кажется, что КодСинтез - это именно то, что вы ищете. Это открытый исходный код и C++.
Я не могу использовать CodeSynthesis в VS2019
Есть инструмент Microsoft, который делает это, я думаю, называется xsd.exe (но я сам не пробовал).
Могу ошибаться, но похоже, что это не поддерживает C++, только .Net C#, VB и J #.
xsd.exe не поддерживает стандартный C++, только "управляемый" C++ от Microsoft, который использует материал CLR XML.
xsd.exe также может сгенерировать .xsd в код Cpp.
Codalogic LMX - тоже вариант.
Objective Systems, Inc. Компилятор XML-схемы XBinder (не только для C++).
Инструментарий gSOAP тоже может это сделать! Он легкий и поддерживает C / C++. Я уже успешно использовал его в очень сложных проектах. Кроме того, он под лицензией GPL2.
Переносимость: gSOAP поддерживает большинство платформ, включая встроенные системы и небольшие ОС (например, WinCE, Symbian и PalmOS). Переносимость протестирована для Windows (98, XP, Vista), Linux, Unix, Mac OS X, Solaris, HP-UX, AIX, FreeBSD, TRU64, Irix, QNX и VxWorks.
Имеет те же лицензионные ограничения, что и генератор CodeSynthesis.
См. XmlPlus-xsd2cpp в Google:
XmlPlus xsd2cpp provides "simple to use" C++ XML data-binding through W3C XML-Schema.
Использование XmlPlus регулируется Стандартная общественная лицензия ограниченного применения GNU
Обратите внимание, что этот инструмент не принадлежит Google, он просто размещен на Google Code.
Выглядит многообещающе. К сожалению, xsd2cpp не поддерживает все спецификации xsd: / например. attributeGroups не поддерживаются.
Все генераторы абсолютно ужасные.
XSD описывает иерархию классов, в которой классы содержат подклассы, которые могут содержать другие подклассы, и все, что вы хотите сделать, это представить ее таким же образом.
Например, если это ваша схема:
<xs:element name = "shipto">
<xs:complexType>
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "address" type = "xs:string"/>
<xs:element name = "city" type = "xs:string"/>
<xs:element name = "country" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Вы хотите создать что-то вроде:
class shipTo
{
private:
string name;
string address;
string city;
string country;
public:
set_Name();
get_Name();
...
}
Вы его не найдете. Самое близкое, что я нашел, - это xjc, предназначенный для Java.
Вы ожидаете чего-то столь же БЕЙСКОГО, поскольку эта функциональность будет существовать, но я еще не нашел ее, и да, я использовал Altova XML-Spy. Я серьезно удивлен, что кто-то предложил бы это в качестве генератора кода. Его сгенерированный код абсолютно ужасен.
Я пишу синтаксический анализатор lex / bison, чтобы сделать это для моего проекта, потому что все инструменты, которые мне удалось найти до сих пор, создают довольно ужасный код. У Altova 30-дневный пробный период, если вы мне не верите, попробуйте. Легче написать парсер lex / bison для моего XSD, чем использовать профессиональный пакет кода за 500 долларов, который создает ужасное представление класса.
Я не могу поверить, что люди используют XML в C++, потому что инструменты для этого ужасны.
Можете ли вы показать нам пример того, что производят «плохие инструменты», и объяснить, почему вы считаете их плохими?
Не могу ответить, так как я застрял в "форматировании mini-Markdown". Я привел вам пример схемы - запустите на нем шпион Altova XML и сравните его с примером, созданным MY вручную с помощью XSD-> C++ lex / bison / hack. Вперед, продолжать. Я не НАИМЕНЕЕ впечатлен доступными инструментами. XJC действительно производит довольно хороший код, однако он на Java, поэтому мне он не подходит. Я чувствую, что работаю с каменными ножами и медвежьими шкурами.
Не делайте шпиона Алтовой ... посмотрите на предложенную вами структуру классов и согласитесь, что это выглядит разумным. Может быть, вы сможете объяснить в 1-2 предложениях, что вам не нравится в Альтове.
Что ж, моя пробная лицензия на AltovaSpy истекла, и хотя я могу использовать свой компьютер задним числом, чтобы заставить его работать, я не собираюсь беспокоиться. Если вы действительно хотите знать, насколько ужасны эти инструменты, просто получите пробную лицензию. Алтова хорошо разбиралась в визуальном представлении. Я могу сказать это, это чрезвычайно многословно, они широко используют чрезвычайно длинные имена префиксов, они используют свои собственные внутренне определенные типы вместо очевидных вещей, таких как «строка» или даже «int», данные не хранятся в самом классе , но вместо этого внутри потока, так что это сводится к синтаксическому анализатору, а не к набору контейнеров.
Предназначено ли использование потоков для решения проблемы действительно огромных файлов XML?
Я не знаю, но в конечном итоге у вас есть куча классов, с которыми очень сложно работать.
Стоит отметить, что открытый источник здесь немного сложнее. Код, сгенерированный КодСинтез, также покрывается лицензией GPL, поэтому вы не можете использовать его в своем приложении, не распространяя исходный код всего приложения. Однако есть исключения для использование небольшого объема или проприетарной лицензии на покупку.