Bagaimana cara menghasilkan .NET 4.0 kelas dari xsd?

317

Apa saja pilihan untuk menghasilkan .NET 4.0 c # kelas (entitas) dari file xsd, menggunakan Visual Studio 2010?

Bastien Vandamme
sumber
@drzaus Saya memiliki pekerjaan ini di masa lalu, tapi sekarang ketika saya menambahkannya ia menghasilkan sebagai kelas DataSet bukan kelas yang saya harapkan. Saya hanya menambahkan item yang ada dan memilih file XSD.
msmucker0527

Jawaban:

490

cukup sederhana; jalankan saja (pada command prompt vs)

xsd your.xsd /classes

(yang akan membuat your.cs). Perhatikan, bagaimanapun, bahwa sebagian besar opsi intrinsik di sini tidak banyak berubah sejak 2.0

Untuk opsi, gunakan xsd /?atau lihat MSDN ; misalnya /enableDataBindingbisa bermanfaat.

Marc Gravell
sumber
83
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Alat \ xsd.exe" / kelas / bahasa: CS your.xsd
GeorgesC
2
Gravell untuk menyelamatkan lagi! Meskipun jawaban ini 100% benar, dalam kasus saya, saya merasa lebih mudah untuk menambahkan jalur direktori xsd.exe ke variabel lingkungan PATH. Komputer saya -> properti -> lanjutan -> variabel lingkungan -> Path - dan tambahkan "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Alat \" (tentu saja perhatikan baik untuk windows dan. NET versi khusus untuk mesin Anda) - selamat coding!
pimbrouwers
15
Untuk kasus Anda memiliki beberapa definisi skema yang saling terkait, cukup sebutkan semuanya. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra
56

xsd.exe seperti yang disebutkan oleh Marc Gravell. Cara tercepat untuk bangun dan menjalankan IMO.

Atau jika Anda membutuhkan lebih banyak fleksibilitas / opsi:

xsd2code VS add-in (Codeplex)

Serge Wautier
sumber
10
Saya tidak bisa mendapatkan kode xsd2 untuk saya. xsd.exe lebih kuat, tetapi berjuang dengan skema yang memiliki grup "melingkar".
Jeff
xsd2code bekerja di visual studio 2017 dan persis apa yang saya cari. Anda harus menjalankannya terlebih dahulu di direktori file program (x86), kemudian gunakan installer vsix. maka itu bekerja dengan baik. itu JAUH SUPERIOUR ke xsd.exe yang menghasilkan array [] [] bukan lists.i punya .xsd raksasa dan saya perlu membuat kelas untuk membuat serial XML ke. xsd.exe tidak akan menghasilkan kode serializable (.net core 2) dan xsd2code bekerja dengan baik
hanzolo
Versi terbaru XSD2CODE untuk Visual Studio 2015 e 2017 ada di sini: marketplace.visualstudio.com/...
Gianpiero
Xsd2code asli sekarang xsd2code ++. Edisi komunitas tersedia di VS Marketplace
Gerd K
17

Saya tunjukkan di sini cara termudah menggunakan Vs2017 dan Vs2019 Buka xsd Anda dengan Visual Studio dan hasilkan file sampel xml seperti di url yang disarankan.

  1. Setelah Anda membuka xsd Anda dalam tampilan desain seperti di bawah ini, klik pada xml schema explorer masukkan deskripsi gambar di sini

2. Dalam "XML Schema Explorer" gulirkan semuanya ke bawah untuk menemukan simpul root / data. Klik kanan pada root / data node dan itu akan menampilkan "Hasilkan Sampel XML". Jika tidak ditampilkan, itu berarti Anda tidak berada di simpul elemen data tetapi Anda berada di salah satu simpul definisi data.

masukkan deskripsi gambar di sini

  1. Salin Xml Anda yang dihasilkan ke clipboard
  2. Buat kelas kosong baru di solusi Anda dan hapus definisi kelas. Hanya Namespace yang harus tetap
  3. Sementara pointer mouse Anda fokus di dalam kelas Anda, pilih EDIT-> Tempel Spesial-> Tempel Xml sebagai Kelas
batmaci
sumber
Sayangnya, ini tidak dijamin untuk menghasilkan semua kelas, tetapi ini adalah trik KEREN.
John Zabroski
1
@ JohnZabroski apakah Anda memiliki kasus yang tidak berhasil untuk Anda? Itu tergantung pada sampel xml, jika Anda dapat membuat sampel xml dengan semua kelas dan anggota, tidak ada alasan untuk melewatkan kelas dan anggota mana pun.
batmaci
Maksud saya adalah langkah 2 tidak dijamin untuk bekerja. Tapi itu adalah trik KEREN.
John Zabroski
Jawaban yang bagus Kamu pantas minum bir dingin !!
HenryGuillen17
14

xsd.exe tidak berfungsi dengan baik ketika Anda memiliki referensi melingkar (yaitu tipe dapat memiliki elemen tipe sendiri secara langsung atau tidak langsung).

Ketika referensi melingkar ada, saya menggunakan Xsd2Code. Xsd2Code menangani referensi melingkar dengan baik dan berfungsi dalam VS IDE, yang merupakan nilai tambah besar. Ini juga memiliki banyak fitur yang dapat Anda gunakan seperti menghasilkan kode serialisasi / deserialisasi. Pastikan Anda mengaktifkan GenerateXMLAttributes jika Anda membuat serialisasi (jika tidak, Anda akan mendapatkan pengecualian untuk pemesanan jika tidak didefinisikan pada semua elemen).

Tidak ada yang berfungsi dengan baik dengan fitur pilihan. Anda akan berakhir dengan daftar / koleksi objek, bukan tipe yang Anda inginkan. Saya akan merekomendasikan menghindari pilihan di xsd Anda jika mungkin karena ini tidak membuat serial / deserialize dengan baik ke kelas yang sangat diketik. Jika Anda tidak peduli dengan ini, maka itu tidak masalah.

Fitur apa pun dalam xsd2code deserializes sebagai System.Xml.XmlElement yang saya temukan sangat nyaman tetapi mungkin menjadi masalah jika Anda ingin objek yang diketik kuat. Saya sering menggunakan apa pun ketika mengizinkan data konfigurasi khusus, sehingga XmlElement mudah dilewatkan ke deserializer XML lain yang dibuat khusus di tempat lain.

VoteCoffee
sumber
Saya menambahkan xsd2code dengan melihat jawaban Anda. Apakah kita perlu mengubah apa pun untuk itu untuk mengurus referensi grup melingkar? Ini tidak berfungsi untuk saya dengan properti default
Jyotsna Sonawane
Saya tidak perlu melakukan sesuatu yang istimewa untuk itu bekerja dengan referensi melingkar. Jika Anda memposting xml sebagai pertanyaan baru dan menambahkan tautan di sini, saya senang melihatnya.
VoteCoffee
10

Untuk solusi cepat dan malas , (dan tidak menggunakan VS sama sekali) coba konverter online ini:

XSD => XML => kelas C #

Contoh 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>

Konversi ke 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>

Yang mengkonversi ke struktur kelas ini:

   /* 
    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; }
    }

}

Perhatian! Perhatikan bahwa ini hanya untuk Anda yang Memulai, hasilnya jelas perlu penyempurnaan!

bu
sumber
Terima kasih banyak. Ini dapat digunakan sebagai contoh yang baik bagi mereka yang sedang belajar Skema XML dan XML di .NET
theeranitp
Jawaban yang bagus Anda layak minum bir dingin!
HenryGuillen17
5

Saya menggunakan XSDskrip batch untuk menghasilkan .xsdfile dan kelas dari XMLlangsung:

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%
hdoghmen
sumber
2

Perintah yang berhasil dalam kasus saya adalah:

xsd /c your.xsd 
Melchia
sumber
1

Jawaban Marc Gravells tepat untuk saya tetapi xsd saya adalah dengan ekstensi .xml. Ketika saya menggunakan program xsd itu memberi:
- The table (Amt) cannot be the child table to itself in nested relations.

Sesuai KB325695 ini saya mengubah nama ekstensi dari .xml ke .xsd dan berfungsi dengan baik.

Igoris Azanovas
sumber
1

Saya menggunakan xsd.exeprompt perintah Windows.

Namun, karena xml saya mereferensikan beberapa xml online (dalam kasus saya http://www.w3.org/1999/xlink.xsdyang mana rujukan http://www.w3.org/2001/xml.xsd) saya juga harus mengunduh skema tersebut, meletakkannya di direktori yang sama dengan xsd saya, dan kemudian mendaftar file-file itu dalam perintah:

"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Alat \ xsd.exe" / kelas / bahasa: CS your.xsd xlink.xsd xml.xsd

Aske B.
sumber
Itu tidak akan menjadi pasar Amazon XSD, tempat Anda membangun kelas untuk saat ini :-) Saya harus bekerja dengan mereka sekali, tidak akan pernah lagi menyentuh mereka atau melakukan pekerjaan apa pun di C # menggunakan file XSD yang menakjubkan, ada kekacauan seperti itu tidak nyata.
Shawty
@shawty Saya bekerja dengan standar GIS - WFS dan WMS - yang ditentukan oleh XSD besar, yang dirujuk silang. Sangat kacau xsd.exekarena tidak suka referensi melingkar, tetapi saya berhasil pada akhirnya.
Aske B.
ya, itu akan menjadi tebakan kedua saya. Melihat itu juga, tidak ada yang sedekat barang Amazon ... memberi saya mimpi buruk mengingat gemetar
shawty
0

Seiring dengan WSDL, saya punya file xsd. Di atas tidak berfungsi dalam kasus saya memberi kesalahan. Ini bekerja sebagai berikut

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
Hamit YILDIRIM
sumber