关于.net:从XSD生成DataContract

Generate DataContract from XSD

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

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


xsd.exe工具早于WCF,并且对[DataContract][DataMember]一无所知。如果确实使用xsd.exe,则必须将WCF切换为使用XmlSerializer而不是默认的DataContractSerializer来序列化数据协定。

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

用法:

1
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命令提示符

并更改所需的目录,或更改目录以在其中放置xsd。

1
svcutil.exe /help

它将列出所有选项。

我仅用于生成数据构造的选项之一是

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

祝您有个美好的一天!


首先与XSD签订DataContracts!

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

安装:复制代码并将其另存为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程序集的引用。

享受。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<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"$(DataContractGeneratedFilePath)"" />

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

  </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位计算机上,您可以在

中找到它

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

在这种情况下:

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