Xsd .NET 4.0 sınıfları nasıl oluşturulur?


317

Visual Studio 2010 kullanarak bir xsd dosyasından .NET 4.0 c # sınıfları (varlıkları) oluşturma seçenekleri nelerdir?


@drzaus Geçmişte bu iş vardı, ama şimdi bir eklemek zaman ben beklediğim sınıflar yerine bir DataSet sınıfı olarak üretir. Sadece mevcut bir öğeyi ekliyorum ve XSD dosyasını seçiyorum.
16:34

Yanıtlar:


490

yeterince basit; sadece çalıştır (vs komut isteminde)

xsd your.xsd /classes

(oluşturacak your.cs). Bununla birlikte, buradaki gerçek seçeneklerin çoğunun 2.0'dan beri çok fazla değişmediğini unutmayın.

Seçenekler için MSDN'yi kullanın xsd /?veya bakın ; örneğin /enableDataBindingyararlı olabilir.


83
"C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Araçlar \ xsd.exe" / sınıflar / dil: CS your.xsd
GeorgesC

2
Tekrar kurtarmaya Gravell! Bu cevap% 100 doğru olsa da, benim durumumda xsd.exe dizin yolunu PATH ortam değişkenine eklemenin en kolay yolunu buldum. Bilgisayarım -> özellikler -> gelişmiş -> ortam değişkenleri -> Yol - ve "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" ekleyin (elbette makinenize özel Windows ve .NET sürümlerine çok dikkat edin) - mutlu kodlama!
pimbrouwers

15
Durum için birbirine bağlı birkaç şema tanımı var, sadece hepsini adlandırın. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

Marc Gravell tarafından belirtildiği gibi xsd.exe. IMO'yu kurmanın ve çalıştırmanın en hızlı yolu.

Veya daha fazla esnekliğe / seçeneğe ihtiyacınız varsa:

xsd2code VS eklentisi (Codeplex)


10
Benim için xsd2code çalışamadım. xsd.exe daha sağlamdır, ancak "dairesel" gruplara sahip şemalarla mücadele eder.
Jeff

xsd2code, visual studio 2017'de çalışıyor ve tam olarak aradığım şeydi. önce program dosyaları (x86) dizininde çalıştırmanız, ardından vsix yükleyicisini kullanmanız gerekir. o zaman harika çalışıyor. lists.i yerine diziler [] [] oluşturan xsd.exe için FAR SUPERIOUR oldu. dev bir .xsd vardı ve XML serileştirmek için sınıflar oluşturmak gerekir. xsd.exe serileştirilebilir kod (.net core 2) oluşturmaz ve xsd2code harika çalıştı
hanzolo

Visual Studio 2015 e 2017 için XSD2CODE'un güncellenmiş sürümü burada: marketplace.visualstudio.com/…
Gianpiero

Orijinal xsd2code şimdi xsd2code ++. Topluluk baskısı VS Marketplace'de mevcuttur
Gerd K

17

Burada size Vs2017 ve Vs2019 kullanarak en kolay yolu göstermek xsd Visual Studio ile açın ve önerilen url örnek bir xml dosyası oluşturmak .

  1. Xsd'nizi aşağıdaki gibi tasarım görünümünde açtıktan sonra, xml şema gezginini tıklayın resim açıklamasını buraya girin

2. “XML Şema Gezgini” içinde kök / veri düğümünü bulmak için aşağı kaydırın. Kök / veri düğümüne sağ tıklayın ve “Örnek XML Oluştur” görünecektir. Gösterilmezse, veri öğesi düğümünde değilsiniz, ancak herhangi bir veri tanımı düğümünde olduğunuz anlamına gelir.

resim açıklamasını buraya girin

  1. Oluşturulan Xml'nizi panoya kopyalayın
  2. Çözümünüzde yeni bir boş sınıf oluşturun ve sınıf tanımını silin. Yalnızca Ad Alanı kalmalıdır
  3. Fare işaretçiniz sınıfınızın içine odaklanmışken, DÜZENLE> Özel Yapıştır> Xml'i Sınıf Olarak Yapıştır'ı seçin.

Maalesef tüm sınıfları üreteceği garanti edilmez, ancak bu bir SOĞUK numaradır.
John Zabroski

1
@JohnZabroski sizin için işe yaramadığı herhangi bir durumunuz oldu mu? Tüm sınıflar ve üyelerle örnek xml oluşturabiliyorsanız, herhangi bir sınıfı ve üyeyi kaçırmak için bir neden yoktur.
batmaci

Demek istediğim adım 2'nin çalışması garanti edilmiyor. Ama bu bir COOL hilesi.
John Zabroski

Harika cevap. Biraz soğuk bira hak ediyorsun !!
HenryGuillen17

14

Dairesel referanslarınız olduğunda xsd.exe iyi çalışmaz (örn. bir tür doğrudan veya dolaylı olarak kendi türünde bir öğeye sahip olabilir).

Dairesel başvurular olduğunda Xsd2Code kullanıyorum. Xsd2Code, dairesel referansları iyi işler ve büyük bir artı olan VS IDE içinde çalışır. Ayrıca, serileştirme / serileştirme kodunu oluşturmak gibi kullanabileceğiniz birçok özelliğe sahiptir. Yine de serileştirme oluşturuyorsanız GenerateXMLAttributes'ı açtığınızdan emin olun (aksi takdirde tüm öğelerde tanımlanmadıysa sipariş için istisnalar alırsınız).

Her ikisi de seçim özelliği ile iyi çalışmıyor. istediğiniz türün yerine liste / nesne koleksiyonuyla karşılaşırsınız. Eğer güçlü bir şekilde yazılmış bir sınıfa iyi serileştirmek / serisini kaldırmak değil gibi mümkünse xsd seçim kaçınarak tavsiye ederim. Bununla ilgilenmiyorsan, o zaman sorun değil.

Xsd2code içindeki herhangi bir özellik System.Xml.XmlElement olarak serileştirir. Özel yapılandırma verilerine izin verirken genellikle herhangi birini kullanırım, bu nedenle bir XmlElement, başka bir yerde özel olarak tanımlanan başka bir XML deserializer'a geçmek için uygundur.


Cevabınıza bakarak xsd2code ekledim. Dairesel grup referanslarına bakmak için herhangi bir şeyi değiştirmemiz gerekiyor mu? Benim için varsayılan özelliklerle çalışmıyor
Jyotsna Sonawane

Dairesel referanslarla çalışabilmesi için özel bir şey yapmam gerekmiyordu. Xml'yi yeni bir soru olarak gönderirseniz ve buraya bir bağlantı eklerseniz, buna bir göz atmaktan memnuniyet duyarız.
Oylama Kahve

10

Bir İçin Hızlı ve tembel çözümü , (ve hiç VS kullanarak değil) bu çevrimiçi dönüştürücüleri deneyin:

  • xsd-xml-dönüştürücü burada
  • xmltocsharp dönüştürücü burada

XSD => XML => C # sınıfları

Örnek 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>

XML'ye dönüştürür:

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

Bu sınıf yapısına dönüşen:

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

}

Dikkat! Bunun sadece Başlarken için olduğunu göz önünde bulundurun, sonuçların açıkça iyileştirmelere ihtiyacı var!


Çok teşekkür ederim. Bu, .NET'te XML Şeması ve XML öğrenenler için iyi bir örnek olarak kullanılabilir
theeranitp

Harika cevap. Biraz soğuk bira hak ediyorsun!
HenryGuillen17

5

Kullandığım XSDüretmek için bir toplu komut dosyasında .xsddosya ve sınıfları XMLdoğrudan:

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

Benim durumumda çalışan komut şuydu:

xsd /c your.xsd 

1

Marc Gravells yanıtı benim için doğru ama benim xsd .xml uzantısı ile oldu. Ben xsd programı kullandığımda verdi:
- The table (Amt) cannot be the child table to itself in nested relations.

Bu KB325695 göre uzantısı .xml .xsd için yeniden adlandırdı ve iyi çalıştı.


1

Kullandığım xsd.exeistemi, Windows komut.

Ancak, benim xml birkaç çevrimiçi xml (bu durumda http://www.w3.org/1999/xlink.xsdhangi referanslar http://www.w3.org/2001/xml.xsd) referans beri bu şemaları indirmek, benim xsd ile aynı dizine koymak ve komutta bu dosyaları listelemek zorunda kaldı:

"C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Araçlar \ xsd.exe" / sınıflar / dil: CS your.xsd xlink.xsd xml.xsd


Bu Amazon pazar yeri olmayacak XSD sizin için bina sınıfları bu nerede olurdu :-) Onlarla bir kez çalışmak zorunda kaldım, bir daha asla onlara dokunmayacağım ya da C # amazon XSD dosyalarını kullanarak herhangi bir iş yapacağım böyle bir karmaşa gerçek dışı.
shawty

@shawty Büyük, dairesel çapraz referanslı XSD'ler tarafından tanımlanan CBS ve WMS GIS standartları ile çalışıyordum. xsd.exeDairesel referansları sevmediği için büyük bir karmaşa vardı , ama sonunda başarılıydım.
Aske

evet, bu benim ikinci tahminim olurdu. Görülme bunlar da hırsız hiçbir yerde bir kötü yanı Amazonlar şeyler olsa ... Beni hatırlayarak kabuslar verir shudders
shawty

0

WSDL ile birlikte xsd dosyalarım vardı. Yukarıdaki benim durumumda işe yaramadı hata verdi. Aşağıdaki gibi çalıştı

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.