Создание 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 "$(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-битной машине вы найдете его в
%systemdrive%\Program Files (x86)\MSBuild\<version you use>
в этом случае:
%systemdrive%\Program Files (x86)\MSBuild.0\Microsoft.Common.Targets\ImportAfter\