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

Создание DataContract из XSD

Я хочу иметь возможность генерировать DataContract из файла XSD, предпочтительно используя xsd.exe tool. Каков самый простой способ автоматического генерации [DataContract] и [DataMember] для каждого из моих элементов?

Или есть лучший подход? Я пытаюсь избежать необходимости воссоздавать контракт данных каждый раз, когда файл XSD изменяется и регенерируется.

4b9b3361

Ответ 1

Инструмент xsd.exe предшествует WCF и ничего не знает о [DataContract] и [DataMember]. Если вы используете xsd.exe, вам придется переключить WCF, чтобы использовать XmlSerializer вместо своего по умолчанию DataContractSerializer для сериализации контрактов данных.

эквивалент WCF для xsd.exe svcutil.exe - он имеет параметр /dconly, который создает только контракты данных, из данный XSD файл. Это приведет к созданию файла С# или VB.NET для вас, содержащего контракты с данными, красиво аннотированные.

Использование:

svcutil.exe (name of your XSD).xsd /dconly

Это создаст файл *.cs с тем же базовым именем в вашем каталоге.

По моему опыту, svcutil.exe довольно разборчив в своих структурах XML, так что не удивляйтесь, если он лает на вас с множеством предупреждений и/или ошибок.

Ответ 2

Используйте svcutil.exe вместо xsd.exe

Как использовать? Перейти в меню "Пуск" → Microsoft Visual Studio 2008 → Инструменты Visual Studio → Командная строка Visual Studio 2008

и измените нужную вам функцию или измените каталог, где есть xsd.

svcutil.exe /help 

он отобразит все параметры.

одна из опций, которые я использую для создания только данных, составляет

svcutil.exe /target:code /n:*,[Your Company and Department].Common.DataTransferObjects /dataContractOnly /serializer:auto /importXmlTypes common.xsd /out:common.cs

Сохраняйте кодирование hava хорошего дня!

Ответ 3

Сначала DataContracts от XSD!

Это современный способ и очень хорошая практика, однако VS2010 имеет очень ограниченную поддержку автоматизации для этого. Следовательно, я сел и написал чистую цель msbuild, которая: не требует модификации файла proj и генерирует .g.cs. Вы также можете легко генерировать код VB с небольшими изменениями в этом файле.

Instalaltion: скопируйте код и сохраните его как файл GenerateDataContractsFromXSD.targets в папку "C:\Program Files\MSBuild\4.0\Microsoft.Common.targets\ImportAfter". Это позволяет msbuild читать его каждый раз, когда он запускается, и то же самое относится к VS2010.

Использование:

  • ReStart VS2010 и добавьте xsd в ваш проект.
  • Выберите файл XSD и нажмите F4, чтобы отобразить окно инструментов свойств.
  • Измените свойство Build Action на значение GenerateDataContracts
  • Создайте проект с помощью XSD файла. Он генерирует первый файл .g.cs.
  • Измените представление в обозревателе решений, чтобы показать все файлы в файловой системе.
  • Включить новый сгенерированный файл в проект.
  • Добавьте ссылку на сборку System.Runtime.Serialization.

Enjoy.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Inject into the sequence of targets in order to add a generated file to compile -->
  <PropertyGroup>
    <CoreCompileDependsOn>
      GenerateDataContractsFromXSD;
      $(CoreCompileDependsOn);
    </CoreCompileDependsOn>
  </PropertyGroup>

  <ItemGroup>
    <SvcUtilParam Include="/nologo" />
    <SvcUtilParam Include="/target:code" />
    <SvcUtilParam Include="/dataContractOnly" />
    <SvcUtilParam Include="/serializer:DataContractSerializer" />
    <SvcUtilParam Include="/language:csharp" />
    <SvcUtilParam Include="/enableDataBinding" />
    <SvcUtilParam Include="/serializable" />
    <SvcUtilParam Include="/internal" />
  </ItemGroup>

  <ItemGroup>
    <AvailableItemName Include="GenerateDataContracts">
      <Targets>GenerateDataContractsFromXSD</Targets>
    </AvailableItemName>
  </ItemGroup>

  <ItemDefinitionGroup>
    <GenerateDataContracts>
      <!-- Use the following options to pass serialization options to SVCUTIL -->
      <DataContractSchemaMapping>"/n:*,$(AssemblyName).Data"</DataContractSchemaMapping>
    </GenerateDataContracts>
  </ItemDefinitionGroup>

  <!-- Automated Data Contract Serialisation using the SvcUtil.Exe tool -->
  <!-- in order to make it automated you have to set the build tool in properties window to GenerateDataContracts -->
  <Target Name="GenerateDataContractsFromXSD"
          Inputs="@(GenerateDataContracts)"
          Outputs="%(GenerateDataContracts.RootDir)\%(GenerateDataContracts.Directory)%(GenerateDataContracts.Filename).g.cs">

    <ItemGroup>
      <DataContractItems Include="@(GenerateDataContracts -> '%(FullPath)')" Condition="'%(Extension)' == '.xsd'" />
    </ItemGroup>

    <PropertyGroup>
      <DataContractGeneratedFilePath>%(DataContractItems.RootDir)\%(DataContractItems.Directory)%(DataContractItems.Filename).g.cs</DataContractGeneratedFilePath>
      <DataContractGeneratedIdentifier>@(GenerateDataContracts -> '%(RelativeDir)')%(DataContractItems.Filename).g.cs</DataContractGeneratedIdentifier>
    </PropertyGroup>

    <GetFrameworkSdkPath>
        <Output TaskParameter="Path" PropertyName="WIN_SDK_PATH" />
    </GetFrameworkSdkPath>

    <Exec 
      Condition="'@(DataContractItems)' != ''"
      Command="attrib -r &quot;$(DataContractGeneratedFilePath)&quot;" />

    <Exec
      Condition="'@(DataContractItems)' != ''"
      Outputs="$(DataContractGeneratedFilePath)"
      Command="&quot;$(WIN_SDK_PATH)bin\SvcUtil.exe&quot; @(SvcUtilParam, ' ') @(GenerateDataContracts -> '%(DataContractSchemaMapping)') &quot;/out:$(DataContractGeneratedFilePath)&quot; &quot;%(DataContractItems.FullPath)&quot;" />

  </Target>

  <Target Name="GetCopyGenerateDataContractItems"
          AfterTargets="AssignTargetPaths">
    <ItemGroup>
      <DataContractItems Include="@(GenerateDataContracts -> '%(FullPath)')" Condition="'%(Extension)' == '.xsd'" />
    </ItemGroup>

    <AssignTargetPath Files="@(DataContractItems)" RootFolder="$(MSBuildProjectDirectory)">
      <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
    </AssignTargetPath>

  </Target>

 </Project>

Ответ 4

На 64-битной машине вы найдете ее в

%systemdrive%\Program Files (x86)\MSBuild\<version you use>

В этом случае:

%systemdrive%\Program Files (x86)\MSBuild\4.0\Microsoft.Common.Targets\ImportAfter\