2010-02-03 32 views
26

Tôi muốn có thể tạo một DataContract từ tệp XSD, tốt nhất là sử dụng xsd.exe tool. Cách dễ nhất để tự động tạo ra các số [DataContract][DataMember] trên từng mục của tôi là gì?Tạo DataContract từ XSD

Hoặc có cách tiếp cận tốt hơn không? Tôi đang cố gắng tránh phải tạo lại hợp đồng dữ liệu mỗi lần tệp XSD được thay đổi và được tạo lại.

+0

Ok bây giờ tôi nhận được lỗi khác. maxOccurs trên DownloadRequestItem phải 1 Đây là schema của tôi \t elementFormDefault => \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t – Daveo

+0

bạn có thể vui lòng cập nhật câu hỏi ban đầu của mình bằng cách chỉnh sửa câu hỏi đó không ?? Đưa XML vào nhận xét là REALLY REALLY khó đọc và lộn xộn ..... –

+0

wcfBlue http: //wscfblue.codeplex.com/ –

Trả lời

42

Công cụ xsd.exe đặt trước WCF và không biết bất cứ điều gì về [DataContract][DataMember]. Nếu bạn sử dụng xsd.exe, bạn sẽ phải chuyển WCF để sử dụng XmlSerializer thay vì mặc định DataContractSerializer để tuần tự hóa các hợp đồng dữ liệu.

Tương đương WCF cho xsd.exesvcutil.exe - nó có tham số /dconly chỉ tạo hợp đồng dữ liệu, từ tệp XSD đã cho. Điều này sẽ tạo ra một tập tin C# hoặc VB.NET cho bạn, có chứa các hợp đồng dữ liệu được chú thích độc đáo.

Cách sử dụng:

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

Điều này sẽ tạo ra một cs * tập tin bằng tên cơ sở tương tự trong thư mục của bạn.

Theo kinh nghiệm của tôi, svcutil.exe khá kén chọn về cấu trúc XML của nó - vì vậy đừng ngạc nhiên nếu nó sủa bạn với hàng tấn cảnh báo và/hoặc lỗi.

+0

Cảm ơn bạn Tôi không biết công cụ này tồn tại – Daveo

+0

* khá cầu kỳ về cấu trúc XML của nó * - DCS làm gì và không hỗ trợ được ghi lại ở đây https://msdn.microsoft.com/en-us/library/ms733112 (v = vs.110) .aspx –

11

Sử dụng svcutil.exe thay vì xsd.exe

Cách sử dụng? Đi tới Trình đơn Bắt đầu -> Microsoft Visual Studio 2008 -> Công cụ Visual Studio -> Visual Studio 2008 Command Prompt

và thay đổi directoy bạn muốn hoặc thay đổi thư mục để thay thế xsd của bạn.

svcutil.exe /help 

nó sẽ liệt kê tất cả các tùy chọn.

một trong những lựa chọn tôi sử dụng để tạo ra dữ liệu contarct chỉ là

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

Giữ mã hóa HAVA ngày tốt lành!

3

DataContracts từ XSD trước!

Đó là cách thức hiện đại và thực hành rất tốt, tuy nhiên, VS2010 có hỗ trợ tự động hóa rất hạn chế cho nó. Do đó, tôi ngồi xuống và viết một mục tiêu msbuild tinh khiết mà: không yêu cầu sửa đổi tập tin proj và tạo ra .g.cs. Bạn cũng có thể đạt được tạo mã VB rất dễ dàng với các chỉnh nhỏ trong tệp này.

Instalaltion: Sao chép mã và lưu nó dưới dạng tệp GenerateDataContractsFromXSD.targets vào thư mục 'C: \ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter'. Điều này làm cho msbuild đọc nó mỗi khi nó bắt đầu và áp dụng cho VS2010.

Cách sử dụng:

  • khởi động lại VS2010 và thêm một xsd vào dự án của bạn.
  • Chọn tệp XSD và nhấn F4 để hiển thị cửa sổ công cụ thuộc tính.
  • Thay đổi thuộc tính Build Action để chứa giá trị GenerateDataContracts
  • Tạo dự án với tệp XSD. Nó tạo tệp .g.cs đầu tiên.
  • Chuyển đổi chế độ xem trong Solution Explorer để hiển thị tất cả các tệp trên hệ thống tệp.
  • Bao gồm tệp mới được tạo trong dự án.
  • Thêm tham chiếu đến System.Runtime.Serialization assembly.

Thưởng thức.

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

Bạn đang giải pháp là interresting nhưng "C: \ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter" Tôi không thấy thư mục đó trên máy tính của tôi. – Serge

+1

@Serge, ** Giả định ** là bạn sử dụng MSBuild của .NET4 và VS2010, trong trường hợp này chỉ cần tạo thư mục còn thiếu (s) và lưu tệp mục tiêu ở đó (msbuild internaly tìm kiếm vị trí này). Giải pháp này có thể làm việc với phiên bản MSBuild trước đó, nếu có những thay đổi thích hợp được cung cấp. – pavelz

1

Trên một máy 64-bit, bạn sẽ tìm thấy nó trong

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

Trong trường hợp này:

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