从XSD生成DataContract

时间:2010-02-03 00:41:42

标签: .net wcf xsd datacontract

我希望能够从XSD文件生成DataContract,最好使用xsd.exe tool。在我的每件商品上自动生成[DataContract][DataMember]的最简单方法是什么?

还是有更好的方法吗?我试图避免每次更改和重新生成XSD文件时重新创建数据协定。

4 个答案:

答案 0 :(得分:44)

xsd.exe工具早于WCF,对[DataContract][DataMember]一无所知。如果您使用xsd.exe,则必须切换WCF以使用XmlSerializer而不是默认DataContractSerializer来序列化数据合同。

xsd.exe的WCF等效项为svcutil.exe - 它有一个参数/dconly,它仅从给定的XSD文件创建数据协定。这将为您生成一个C#或VB.NET文件,其中包含很好地注释的数据协议。

用法:

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

这将在您的目录中使用相同的基本名称生成* .cs文件。

根据我的经验,svcutil.exe对其XML结构非常挑剔 - 所以如果它因大量警告和/或错误而咆哮,请不要感到惊讶。

答案 1 :(得分:12)

使用svcutil.exe而不是xsd.exe

如何使用? 转到“开始”菜单 - > Microsoft Visual Studio 2008 - > Visual Studio工具 - > Visual Studio 2008命令提示符

并更改您想要的directoy或将目录更改为您的xsd就在那里。

svcutil.exe /help 

它将列出所有选项。

我用来生成数据contarct的选项之一是

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

保持编码hava美好的一天!

答案 2 :(得分:3)

首先从XSD获取DataContracts!

这是现代化的方式和非常好的实践,但VS2010的自动化支持非常有限 为了它。因此,我坐下来写了一个纯粹的msbuild目标:不需要proj文件修改 并生成.g.cs。您还可以通过此文件中的小调整轻松生成VB代码。

Instalaltion:复制代码并将其保存为GenerateDataContractsFromXSD.targets文件到文件夹'C:\ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter'。这使得msbuild每次启动都会读取它,同样适用于VS2010。

用法:

  • 重新启动VS2010并在项目中添加xsd。
  • 选择XSD文件并按F4以显示属性工具窗口。
  • 将Build Action属性更改为包含值GenerateDataContracts
  • 使用XSD文件构建项目。它会生成第一个.g.cs文件。
  • 在解决方案资源管理器中查看视图以显示文件系统上的所有文件。
  • 在项目中包含新生成的文件。
  • 添加对System.Runtime.Serialization程序集的引用。

享受。

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

答案 3 :(得分:1)

在64位计算机上,您可以在

中找到它
%systemdrive%\Program Files (x86)\MSBuild\<version you use>

在这种情况下:

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