Apa saja pilihan untuk menghasilkan .NET 4.0 c # kelas (entitas) dari file xsd, menggunakan Visual Studio 2010?
Apa saja pilihan untuk menghasilkan .NET 4.0 c # kelas (entitas) dari file xsd, menggunakan Visual Studio 2010?
Jawaban:
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 /enableDataBinding
bisa bermanfaat.
xsd schema1.xsd schema2.xsd schema3.xsd /c
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)
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.
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.
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.
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!
Saya menggunakan XSD
skrip batch untuk menghasilkan .xsd
file dan kelas dari XML
langsung:
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%
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.
Saya menggunakan xsd.exe
prompt perintah Windows.
Namun, karena xml saya mereferensikan beberapa xml online (dalam kasus saya http://www.w3.org/1999/xlink.xsd
yang 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
xsd.exe
karena tidak suka referensi melingkar, tetapi saya berhasil pada akhirnya.
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