Подтвердить что ты не робот

Сравнение генераторов кода XSD

Я занимаюсь некоторыми исследованиями в генерации кода из файлов схемы xsd. Мои требования:

  • Должен генерировать код С# 2.0 (или выше), используя общие коллекции, где это необходимо.
  • Должен генерировать комментарии из комментариев xsd
  • Должен генерировать полностью сериализуемый код.
  • Должна иметь возможность генерировать восстанавливаемые базовые типы при генерации из нескольких xsd с тем же включением.

(см. также мои другие вопросы: Как я могу сгенерировать несколько классов из xsds с общим включением? и Как я могу генерировать комментарии из xs: теги документации в wsdl?

Я нашел следующие варианты:

Я пропустил какой-нибудь? Поскольку (1), (2) и (5) не генерируют код 2.0, и у меня возникают проблемы с сериализацией кода из (3). Что вы используете при генерации кода?

4b9b3361

Ответ 1

Я считаю, XSD2Code - лучший инструмент, доступный в настоящее время (в 2011 году).

Недавно я прошел один и тот же процесс на работе по анализу доступных инструментов, поэтому я подумал, что дам обновленный ответ, относящийся к VS2010.

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

Xsd2Code, однако, является превосходным инструментом и, похоже, активно поддерживается. Он предоставляет все функциональные возможности, перечисленные выше, и многое другое. На странице CodePlex также есть отличные примеры того, как различные параметры влияют на вывод.

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

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

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

Добавление: Если вы решили продолжить 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

Выполните следующие шаги, чтобы при необходимости очистить сгенерированный код:

  • Regex replace - текущий проект, case, whole word - [System.Runtime.Serialization.DataContractAttribute(имя: b * =: b *: q,: bNamespace: b =: b * {: q}) ] с [DataContract (пространство имен =\1)]
  • Заменить - текущий проект, случай, целое слово - [System.Runtime.Serialization.DataMemberAttribute()] с [DataMember]
  • Regex replace - текущий проект, case, whole word - System.Nullable\< {: w} > с \1 \?
  • Regex replace - открыть документы, case, whole word - {: w} TYPE с \1
  • Заменить - открыть документы, дело, целое слово - System.DateTime с DateTime, а затем добавить отсутствующие с помощью операторов
  • Заменить - открыть документы, регистр, целое слово - [System.Xml.Serialization.XmlIgnoreAttribute()] с [XmlIgnore]
  • Заменить - текущий проект - System.Xml.Serialization.XmlArrayAttribute с XmlArray
  • Заменить - текущий проект - System.Xml.Serialization.XmlArrayItemAttribute с XmlArrayItem
  • Regex replace - текущий проект - , [: Wh] +///\ < примечания /\ > с ,

Надеюсь, что это поможет кому-то.

Ответ 2

Я еще не проверил это, но Linq2XSD может быть полезной альтернативой.

Я собираюсь дать этому выстрел. LINQ с генерацией XSD будет лучше, чем любой из этих инструментов, о которых вы говорили, - при условии, что он работает хорошо.

Ответ 4

Я немного больше года назад использовал CodeXS. С некоторыми незначительными настройками (a script, которые немного очистили сгенерированный код), это сработало.

Существует также Dingo, которые имеют некоторые очень хорошие возможности расширяемости (которые нам не нужны).

Ответ 6

Лучший генератор класса XSD, который я нашел, - это thinktecture WSCF.blue , Это лучше, чем большинство других по двум причинам:

  • Исправление имен. Это означает обсадку и плюризацию типов и имен свойств.
  • Создает отдельный файл для каждого класса.

Или, если вы ищете решение T4, вы можете попробовать XsdClassGen , Этот не работает для меня. Но хорошей новостью является то, что это файл T4, поэтому его легко исправить!

Ответ 7

Ниже приведен пример веб-использования с использованием XSLT для преобразования XML в код С#. В примере используется модель (XML), которая описывает службы (в основном имена служб, пространства имен и список операций), затем генерирует службы WCF (интерфейсы, сообщения, ошибки, тесты и т.д.) Все в С#.net.