Làm cách nào để tạo các lớp .NET 4.0 từ xsd?


317

Các tùy chọn để tạo .NET 4.0 c # class (thực thể) từ tệp xsd, sử dụng Visual Studio 2010 là gì?


@drzaus Tôi đã có công việc này trong quá khứ, nhưng bây giờ khi tôi thêm nó, nó tạo ra như một lớp Dataset thay vì các lớp tôi mong đợi. Tôi chỉ cần thêm một mục hiện có và chọn tệp XSD.
msmucker0527

Câu trả lời:


490

đủ đơn giản; chỉ cần chạy (tại dấu nhắc lệnh vs)

xsd your.xsd /classes

(sẽ tạo ra your.cs). Tuy nhiên, lưu ý rằng hầu hết các tùy chọn nội tại ở đây không thay đổi nhiều kể từ 2.0

Đối với các tùy chọn, sử dụng xsd /?hoặc xem MSDN ; ví dụ /enableDataBindingcó thể hữu ích


83
"C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Công cụ \ xsd.exe" / class / ngôn ngữ: CS your.xsd
GeorgesC

2
Gravell để giải cứu một lần nữa! Mặc dù câu trả lời này là đúng 100%, nhưng trong trường hợp của tôi, tôi thấy dễ dàng nhất để thêm đường dẫn thư mục xsd.exe vào biến môi trường PATH. Máy tính của tôi -> thuộc tính -> nâng cao -> biến môi trường -> Đường dẫn - và thêm "C: \ Chương trình tệp (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Công cụ \" (tất nhiên chú ý đến cả phiên bản windows và .NET dành riêng cho máy của bạn) - mã hóa vui vẻ!
pimbrouwers

15
Đối với trường hợp bạn có một số định nghĩa lược đồ liên kết với nhau, chỉ cần đặt tên cho tất cả. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

xsd.exe như được đề cập bởi Marc Gravell. Cách nhanh nhất để đứng dậy và chạy IMO.

Hoặc nếu bạn cần linh hoạt hơn / tùy chọn:

bổ trợ xsd2code VS (Codeplex)


10
Tôi không thể có xsd2code để làm việc cho tôi cả. xsd.exe mạnh hơn, nhưng phải vật lộn với các lược đồ có các nhóm "tròn".
Jeff

xsd2code hoạt động trong visual studio 2017 và chính xác là những gì tôi đang tìm kiếm. bạn phải chạy nó trước trong thư mục tệp chương trình (x86), sau đó sử dụng trình cài đặt vsix. sau đó nó hoạt động tuyệt vời. đó là FAR SUPERIOUR cho xsd.exe đã tạo ra các mảng [] [] thay vì list.i có một .xsd khổng lồ và tôi cần tạo các lớp để tuần tự hóa XML thành. xsd.exe sẽ không tạo mã tuần tự hóa (.net core 2) và xsd2code hoạt động rất tốt
hanzolo

Phiên bản cập nhật của XSD2CODE cho Visual Studio 2015 e 2017 có tại đây: marketplace.visualstudio.com/ Từ
Gianpiero

Xsd2code ban đầu bây giờ là xsd2code ++. Phiên bản cộng đồng có sẵn trên VS Marketplace
Gerd K

17

Tôi chỉ cho bạn ở đây cách dễ nhất bằng Vs2017 và Vs2019 Mở xsd của bạn bằng Visual Studio và tạo tệp xml mẫu như trong url được đề xuất.

  1. Khi bạn đã mở xsd của mình trong dạng xem thiết kế như bên dưới, hãy nhấp vào trình thám hiểm lược đồ xml nhập mô tả hình ảnh ở đây

2. Trong Schema XML XML Lược đồ Explorer cuộn xuống hết cỡ để tìm nút gốc / dữ liệu. Nhấp chuột phải vào nút gốc / nút dữ liệu và nó sẽ hiển thị Tập tin XML Tạo mẫu XML. Nếu nó không hiển thị, điều đó có nghĩa là bạn không ở trên nút phần tử dữ liệu nhưng bạn đang ở trên bất kỳ nút định nghĩa dữ liệu nào.

nhập mô tả hình ảnh ở đây

  1. Sao chép Xml đã tạo của bạn vào khay nhớ tạm
  2. Tạo một lớp trống mới trong giải pháp của bạn và xóa định nghĩa lớp. Chỉ duy trì không gian tên
  3. Trong khi con trỏ chuột của bạn tập trung bên trong lớp của bạn, hãy chọn EDIT-> Paste Special-> Paste Xml làm Classes

Điều này không được đảm bảo để tạo ra tất cả các lớp, thật không may, nhưng đó là một thủ thuật COOL.
John Zabroski

1
@JohnZabroski bạn có gặp trường hợp nào không phù hợp với bạn không? Nó phụ thuộc vào xml mẫu, nếu bạn có thể tạo xml mẫu với tất cả các lớp và thành viên, không có lý do gì để bỏ lỡ bất kỳ lớp và thành viên nào.
batmaci

Quan điểm của tôi là bước 2 không được đảm bảo để làm việc. Nhưng đó là một mẹo COOL.
John Zabroski

Câu trả lời tuyệt vời. Bạn xứng đáng với một số loại bia lạnh !!
HenryGuillen17

14

xsd.exe không hoạt động tốt khi bạn có các tham chiếu vòng tròn (tức là một loại có thể sở hữu một phần tử thuộc loại riêng của nó trực tiếp hoặc gián tiếp).

Khi tham chiếu tròn tồn tại, tôi sử dụng Xsd2Code. Xsd2Code xử lý tốt các tham chiếu vòng tròn và hoạt động trong VS IDE, đây là một điểm cộng lớn. Nó cũng có rất nhiều tính năng bạn có thể sử dụng như tạo mã tuần tự hóa / giải tuần tự hóa. Hãy chắc chắn rằng bạn bật GenerateXMLAttribution nếu bạn đang tạo tuần tự hóa (nếu không bạn sẽ có ngoại lệ cho việc đặt hàng nếu không được xác định trên tất cả các yếu tố).

Không hoạt động tốt với các tính năng lựa chọn. bạn sẽ kết thúc với danh sách / bộ sưu tập đối tượng thay vì loại bạn muốn. Tôi khuyên bạn nên tránh lựa chọn trong xsd của mình nếu có thể vì điều này không tuần tự hóa / giải tuần tự hóa tốt thành một lớp được gõ mạnh. Nếu bạn không quan tâm đến điều này, thì đó không phải là vấn đề.

Bất kỳ tính năng nào trong xsd2code đều được giải nén là System.Xml.XmlE bổ sung mà tôi thấy thực sự tiện lợi nhưng có thể là một vấn đề nếu bạn muốn các đối tượng gõ mạnh. Tôi thường sử dụng bất kỳ khi nào cho phép dữ liệu cấu hình tùy chỉnh, vì vậy XmlE bổ sung thuận tiện để chuyển sang một trình giải mã XML khác được tùy chỉnh xác định ở nơi khác.


Tôi đã thêm xsd2code bằng cách xem câu trả lời của bạn. Chúng ta có cần thay đổi bất cứ điều gì cho nó để chăm sóc các tài liệu tham khảo nhóm tròn không? Nó không hoạt động với tôi với các thuộc tính mặc định
Jyotsna Sonawane 2/2/2015

Tôi đã không phải làm bất cứ điều gì đặc biệt để nó hoạt động với các tài liệu tham khảo tròn. Nếu bạn đăng xml dưới dạng câu hỏi mới và thêm một liên kết ở đây, tôi rất vui lòng xem nó.
VoteCoffee 3/2/2015

10

Để có giải pháp nhanh chóng và lười biếng , (và hoàn toàn không sử dụng VS), hãy thử các trình chuyển đổi trực tuyến này:

XSD => XML => Các lớp C #

Ví dụ XSD:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Chuyển đổi sang XML:

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<shiporder xsi:noNamespaceSchemaLocation="schema.xsd" orderid="string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <orderperson>string</orderperson>
  <shipto>
    <name>string</name>
    <address>string</address>
    <city>string</city>
    <country>string</country>
  </shipto>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>3229484693</quantity>
    <price>-6894.465094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2181272155</quantity>
    <price>-2645.585094196054907</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>2485046602</quantity>
    <price>4023.034905803945093</price>
  </item>
  <item>
    <title>string</title>
    <note>string</note>
    <quantity>1342091380</quantity>
    <price>-810.825094196054907</price>
  </item>
</shiporder>

Chuyển đổi cấu trúc lớp này:

   /* 
    Licensed under the Apache License, Version 2.0

    http://www.apache.org/licenses/LICENSE-2.0
    */
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="shipto")]
    public class Shipto {
        [XmlElement(ElementName="name")]
        public string Name { get; set; }
        [XmlElement(ElementName="address")]
        public string Address { get; set; }
        [XmlElement(ElementName="city")]
        public string City { get; set; }
        [XmlElement(ElementName="country")]
        public string Country { get; set; }
    }

    [XmlRoot(ElementName="item")]
    public class Item {
        [XmlElement(ElementName="title")]
        public string Title { get; set; }
        [XmlElement(ElementName="note")]
        public string Note { get; set; }
        [XmlElement(ElementName="quantity")]
        public string Quantity { get; set; }
        [XmlElement(ElementName="price")]
        public string Price { get; set; }
    }

    [XmlRoot(ElementName="shiporder")]
    public class Shiporder {
        [XmlElement(ElementName="orderperson")]
        public string Orderperson { get; set; }
        [XmlElement(ElementName="shipto")]
        public Shipto Shipto { get; set; }
        [XmlElement(ElementName="item")]
        public List<Item> Item { get; set; }
        [XmlAttribute(AttributeName="noNamespaceSchemaLocation", Namespace="http://www.w3.org/2001/XMLSchema-instance")]
        public string NoNamespaceSchemaLocation { get; set; }
        [XmlAttribute(AttributeName="orderid")]
        public string Orderid { get; set; }
        [XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
    }

}

Chú ý! Hãy xem xét rằng đây chỉ là để Bắt đầu, kết quả rõ ràng là cần tinh chỉnh!


Cảm ơn bạn rất nhiều. Điều này có thể được sử dụng như một ví dụ tốt cho những người đang học Lược đồ XML và XML bằng .NET
theeranitp

Câu trả lời tuyệt vời. Bạn xứng đáng với một số loại bia lạnh!
HenryGuillen17

5

Tôi sử dụng XSDtrong một tập lệnh bó để tạo .xsdtệp và các lớp XMLtrực tiếp:

set XmlFilename=Your__Xml__Here
set WorkingFolder=Your__Xml__Path_Here

set XmlExtension=.xml
set XsdExtension=.xsd

set XSD="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1\Tools\xsd.exe"

set XmlFilePath=%WorkingFolder%%XmlFilename%%XmlExtension%
set XsdFilePath=%WorkingFolder%%XmlFilename%%XsdExtension%

%XSD% %XmlFilePath% /out:%WorkingFolder%
%XSD% %XsdFilePath% /c /out:%WorkingFolder%

2

Lệnh làm việc trong trường hợp của tôi là:

xsd /c your.xsd 

1

Câu trả lời của Marc Gravells phù hợp với tôi nhưng xsd của tôi có phần mở rộng là .xml. Khi tôi sử dụng chương trình xsd, nó đã cho:
- The table (Amt) cannot be the child table to itself in nested relations.

Theo KB325695 này, tôi đã đổi tên phần mở rộng từ .xml thành .xsd và nó hoạt động tốt.


1

Tôi đã sử dụng xsd.exetrong dấu nhắc lệnh của Windows.

Tuy nhiên, vì xml của tôi đã tham chiếu một số xml trực tuyến (trong trường hợp của tôi là http://www.w3.org/1999/xlink.xsdtham chiếu http://www.w3.org/2001/xml.xsd), tôi cũng phải tải xuống các sơ đồ đó, đặt chúng vào cùng thư mục với xsd của tôi và sau đó liệt kê các tệp đó trong lệnh:

"C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Công cụ \ xsd.exe" / class / ngôn ngữ: CS your.xsd xlink.xsd xml.xsd


Đó sẽ không phải là thị trường Amazon đặt XSD cho bạn, nơi xây dựng các lớp bây giờ :-) Tôi phải làm việc với họ một lần, tôi sẽ không bao giờ chạm vào họ hoặc làm bất kỳ công việc nào trong C # bằng cách sử dụng các tệp XSD của amazons, có thật là bừa bộn
choàng

@shawty Tôi đã làm việc với các tiêu chuẩn GIS - WFS và WMS - được xác định bởi các XSD lớn, tham chiếu chéo. Là một mớ hỗn độn lớn xsd.exevì nó không giống như các tài liệu tham khảo vòng tròn, nhưng cuối cùng tôi đã thành công.
Aske B.

vâng, đó sẽ là phỏng đoán thứ hai của tôi. Cũng nhìn thấy những thứ đó, không có nơi nào tồi tệ như những thứ của Amazons mặc dù ... mang đến cho tôi những cơn ác mộng nhớ về những cơn rùng mình
choàng

0

Cùng với WSDL, tôi đã có các tệp xsd. Ở trên không hoạt động trong trường hợp của tôi đã đưa ra lỗi. Nó hoạt động như sau

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.