Порівняння генераторів коду XSD [закрито]


76

Я роблю деякі дослідження з генерації коду з файлів схеми xsd. Мої вимоги:

  • Потрібно генерувати код C # 2.0 (або вище), використовуючи загальні колекції, де це потрібно.
  • Потрібно генерувати коментарі з коментарів xsd
  • Потрібно згенерувати повністю серіалізований код.
  • Повинен мати можливість генерувати змінні базові типи під час генерування з декількох xsd з однаковими включеннями.

(див. також інші мої запитання: Як я можу генерувати кілька класів із xsd із загальними включеннями? та як я можу генерувати коментарі з тегів xs: documentation у wsdl?

Я знайшов такі варіанти:

  1. Використовуйте xsd.exe (постачається разом із SDK та Visual Studio)
  2. XSDCodeGen від Daniel Cazzulino
  3. Xsd2Code
  4. CodeXS
  5. XsdObjectGen від Microsoft
  6. XSDClassGen (Здається, відсутній у дії)

Я щось пропустив? Оскільки (1), (2) та (5) не генерують 2.0 коду, і у мене проблеми з серіалізацією коду з (3). Що ви використовуєте при генерації коду?


Які проблеми були у вас із Xsd2Code? У мене з цим проблем не було.
Джон Крафт, 02

5) stackoverflow.com/questions/607085 / ... має 2.0 XSDObjectGen посилання на джерело
Greg Domjan

Відповіді:


62

Я вважаю, що XSD2Code - найкращий доступний на даний момент інструмент (у 2011 році).

Нещодавно я пройшов той самий процес під час аналізу наявних інструментів, тому я думав, що надам оновлену відповідь, яка стосується VS2010 .

Нашим головним драйвером було те, що xsd.exe не генерує XML-документ із анотацій XSD, чого ми і хотіли, оскільки маємо сотні визначень типів. Я спробував усі перелічені вище інструменти, а також інші, і більшість із них були застарілими, не підтримувались або не могли відповідати поточній функціональності xsd.exe, доступній у VS2010.

Однак Xsd2Code є чудовим інструментом і, здається, активно підтримується. Він надає всі перелічені вище функції та багато іншого - на сторінці CodePlex також є чудові приклади того, як різні параметри впливають на вихід.

Він також має щільну інтеграцію VS, включаючи інтеграцію контекстного меню та спеціальний інструмент побудови (що означає, що якщо ви посилаєтесь на XSD у своєму проекті та вказуєте спеціальний інструмент, він автоматично оновлюватиме код під час оновлення XSD). Загалом, ми врятували нам багато роботи.

Короткий огляд інших інструментів, які я розглядав:

  • Динго - Здається, він більше відповідає Java
  • XSDCodeGen - Докладніше про те, як написати власний інструмент побудови
  • CodeXS - цілком хороший інструмент, але менше інтеграції, функцій і більше не підтримується
  • XSDObjectGen - більше не підтримується, менше функціональних можливостей, ніж поточний xsd.exe
  • XSDClassGen - Не вдалося його знайти
  • Бібліотека OXM - рекомендуємо переглянути цей проект, що підтримується та має чудові функції
  • LINQ to XSD - Дуже класний проект, але не те, що я шукав

Додаток. Якщо ви все-таки вирішили продовжувати роботу з XSD2Code, є ряд проблем, які я знайшов, працюючи з інструментом командного рядка. Зокрема, є деякі помилки з обробкою аргументів, які вимагають, щоб деякі аргументи знаходились у певному порядку, а також деякі незадокументовані залежності (наприклад - автоматичні параметри та версія .NET специфічні та залежать від замовлення). Нижче наведені кроки, які я використовував для генерації коду за допомогою XSD2Code, а потім очищення виводу - візьміть біти, які стосуються вас, за необхідності:

Запустіть такий командний файл, щоб сформувати початковий код, змінивши шляхи до правильних розташувань:

@echo off

set XsdPath=C:\schemas
set OutPath=%XsdPath%\Code
set ExePath=C:\Progra~1\Xsd2Code
set Namespace=InsertNamespaceHere

echo.Starting processing XSD files ...
for /f %%a IN ('dir %XsdPath%\*.xsd /a-d /b /s') do call:ProcessXsd %%a

echo.Finished processing XSD files ...
echo.&pause&
goto:eof

:ProcessXsd
%ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /if- /dc /sc /eit
echo.Processed %~n1
goto:eof

За потреби виконайте наступні дії, щоб привести в порядок згенерований код:

  1. Замінити регулярний вираз - поточний проект, випадок, ціле слово - [System.Runtime.Serialization.DataContractAttribute (Ім'я: b * =: b *: q ,: b Простір імен: b =: b * {: q})] на [DataContract ( Простір імен = \ 1)]
  2. Замінити - поточний проект, регістр, ціле слово - [System.Runtime.Serialization.DataMemberAttribute ()] на [DataMember]
  3. Замінити регулярний вираз - поточний проект, регістр, ціле слово - System.Nullable \ <{: w}> на \ 1 \?
  4. Заміна регулярного виразу - відкрити документи, регістр, ціле слово - {: w} ТИП на \ 1
  5. Замінити - відкрити документи, регістр, ціле слово - System.DateTime на DateTime , а потім додати відсутні за допомогою операторів
  6. Замінити - відкрити документи, регістр, ціле слово - [System.Xml.Serialization.XmlIgnoreAttribute ()] на [XmlIgnore]
  7. Замінити - поточний проект - System.Xml.Serialization.XmlArrayAttribute з XmlArray
  8. Замінити - поточний проект - System.Xml.Serialization.XmlArrayItemAttribute з XmlArrayItem
  9. Замінити регулярний вираз - поточний проект - , [: Wh] + /// \ <зауваження / \> на ,

Надія, що комусь допомагає.


2
Я повинен погодитися з тим, що Xsd2Code в даний час є чемпіоном. Просто стежте за неналежним завантаженням надбудови, якщо ви перемістили місце розташування за замовчуванням «Документи» або вручну, або за допомогою об'єкта групової політики. Рішення полягає в тому, щоб захопити файл надбудови з місця встановлення та помістити його в папку Documents \ Visual Studio 2010 \ Addins \.
Стівен Паттен,

1
xsd2code здається мертвим. Сподіваюся, вийде нова версія, є основна помилка блокування та ще кілька помилок, які заважають нам використовувати це реально.
womp

Тільки примітка: я зіткнувся з XsdClassGen на Nuget (див. Nuget.org/List/Packages/XsdClassGen ). У ньому використовується шаблон T4, що приємно, але дуже примітивно.
devuxer

2
Додано Schalk Versteegяк редагувати: XSDtoClasses code.google.com/p/xsd-to-classes -Extendable VS plugin, very similar in capabilities to XSD2Code.
InfantPro'Aravind '12

3
XSD2Code не працює для Visual Studio 2012.
cederlof

9

Я ще не перевіряв це, але Linq2XSD може бути корисною альтернативою.

Я збираюся зробити цьому один постріл. LINQ із генерацією XSD буде кращим за будь-який із цих інструментів, про який ви згадали, за умови, що він працює добре.


5
не турбуйтеся над цим "мертвим проектом". якщо це майже повно і працює, то це не "мертво" - це працює! мені здається, це нормально
Simon_Weaver

2
В даний час я успішно використовую Linq to Xsd в активному проекті. Здається, це найбільш "повний" xsd для відображення класів, який я знайшов. Я спробував використовувати Xsd2Code, але він не дуже добре відобразив складні типи xsd - у мене було обмеження xs: pattern, яке ідеально відображається в Linq на Xsd, але відсутнє в Xsd2Code. Найкраща порада - завантажте джерело для Linq на Xsd - у ньому є ціла купа документів і прикладів проектів, яких немає на вкладці "документи"
codeplex

3
Я використовую його вже пару років. Він має величезні переваги перед іншими
суттєвими

Не працює з Visual Studio 2012.
cederlof

Все ще використовую! (Не для нових матеріалів, але він все ще працює під .NET Core).
Simon_Weaver


2

У проекті трохи більше року тому ми використовували CodeXS. З деякими незначними коригуваннями (скрипт, який трохи очистив згенерований код), це створило привабливість.

Є також Dingo , які мають деякі дуже хороші можливості розширюваності (які нам не потрібні).



0

Найкращий генератор класу XSD, який я знайшов, - це thinktecture WSCF.blue . Це приємніше за більшість інших з двох причин:

  1. Виправлено іменування. Це означає використання коду та плюризації типів та назв властивостей.
  2. Створює окремий файл для кожного класу.

Або, якщо ви шукаєте рішення T4, ви можете спробувати XsdClassGen . Цей не працює для мене. Але хороша новина полягає в тому, що це файл T4, тому його легко виправити!


-2

Ось веб-приклад використання XSLT для перетворення XML в код C #. Приклад бере модель (XML), яка описує служби (в основному імена служб, простори імен та список операцій), а потім генерує послуги WCF (інтерфейси, повідомлення, несправності, тести тощо), усі в C # .net.


Веб-сайт більше не доступний, і ваша відповідь також не корисна.
кодування
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.