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

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

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

4 ответов


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

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

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

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

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

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


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

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

и измените directoy, который вы хотите, или измените каталог, чтобы ваш 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 Добрый день!


DataContracts из XSD сначала!

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

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

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

  • перезапустите VS2010 и добавьте xsd в свой проект.
  • выберите xsd-файл и нажмите F4 для отображения окна свойств инструмента.
  • измените свойство действия сборки, чтобы содержать значение GenerateDataContracts
  • создайте проект с помощью XSD-файла. Он генерирует первый .г. cs файл.
  • изменить вид в обозревателе решений, чтобы показать все файлы в файловой системе.
  • включить новый сгенерированный файл в проект.
  • добавить ссылку на System.Во время выполнения.Сборка сериализации.

наслаждайтесь.

<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>

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

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

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

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