Generate DataContract from XSD
我希望能够从XSD文件生成
还是有更好的方法?我试图避免每次更改和重新生成XSD文件时都必须重新创建数据协定。
用法:
1 | svcutil.exe (name of your XSD).xsd /dconly |
这将在您的目录中生成一个具有相同基本名称的* .cs文件。
根据我的经验,
使用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\\ |