Come generare classi .NET 4.0 da xsd?


317

Quali sono le opzioni per generare classi (entità) .NET 4.0 c # da un file xsd, usando Visual Studio 2010?


@drzaus Ho avuto questo lavoro in passato, ma ora quando ne aggiungo uno viene generato come una classe DataSet invece delle classi che mi aspetterei. Aggiungo solo un elemento esistente e seleziono il file XSD.
msmucker0527,

Risposte:


490

abbastanza semplice; basta eseguire (al prompt dei comandi vs)

xsd your.xsd /classes

(che creerà your.cs ). Si noti, tuttavia, che la maggior parte delle opzioni intrinseche qui non sono cambiate molto dal 2.0

Per le opzioni, utilizzare xsd /?o consultare MSDN ; per esempio /enableDataBindingpuò essere utile.


83
"C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classi / lingua: CS your.xsd
GeorgesC

2
Gravell di nuovo in soccorso! Sebbene questa risposta sia corretta al 100%, nel mio caso ho trovato più semplice aggiungere il percorso della directory xsd.exe alla variabile di ambiente PATH. Il mio computer -> proprietà -> avanzate -> variabili di ambiente -> Percorso - e aggiungi "C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" (ovviamente presta molta attenzione sia alla versione di Windows sia a quella specifica della tua macchina) - buona codifica!
pimbrouwers,

15
Nel caso in cui tu abbia diverse definizioni di schema interconnesse, basta nominarle tutte. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra,

56

xsd.exe come menzionato da Marc Gravell. Il modo più veloce per iniziare a utilizzare IMO.

O se hai bisogno di maggiore flessibilità / opzioni:

Componente aggiuntivo xsd2code VS (Codeplex)


10
Non sono riuscito a far funzionare xsd2code per me. xsd.exe è più robusto, ma è in difficoltà con schemi con gruppi "circolari".
Jeff,

xsd2code funziona in Visual Studio 2017 ed era esattamente quello che stavo cercando. devi prima eseguirlo nella directory dei file di programma (x86), quindi utilizzare il programma di installazione vsix. allora funziona alla grande. è stato FAR SUPERIOUR a xsd.exe che ha generato array [] [] invece di lists.i aveva un gigantesco .xsd e ho bisogno di creare classi per serializzare l'XML. xsd.exe non genererebbe codice serializzabile (.net core 2) e xsd2code funzionerebbe alla grande
hanzolo

La versione aggiornata di XSD2CODE per Visual Studio 2015 e 2017 è qui: marketplace.visualstudio.com/…
Gianpiero

Il codice xsd2 originale ora è xsd2code ++. L'edizione della community è disponibile su VS Marketplace
Gerd K,

17

Vi mostro qui il modo più semplice usando Vs2017 e Vs2019 Aprire il XSD con Visual Studio e generare un file XML di esempio come nel URL suggerito.

  1. Dopo aver aperto il tuo xsd in visualizzazione struttura come di seguito, fai clic su Esplora schemi XML inserisci qui la descrizione dell'immagine

2. In "XML Schema Explorer" scorrere fino in fondo per trovare il nodo radice / dati. Fai clic destro sul nodo radice / dati e mostrerà "Genera XML di esempio". Se non viene visualizzato, significa che non ci si trova sul nodo dell'elemento dati ma si trova su uno dei nodi della definizione dei dati.

inserisci qui la descrizione dell'immagine

  1. Copia il tuo Xml generato negli appunti
  2. Creare una nuova classe vuota nella soluzione ed eliminare la definizione della classe. Dovrebbe rimanere solo lo spazio dei nomi
  3. Mentre il puntatore del mouse è focalizzato all'interno della tua classe, scegli MODIFICA-> Incolla speciale-> Incolla Xml come classi

Questo non è garantito per generare tutte le classi, sfortunatamente, ma è un trucco COOL.
John Zabroski il

1
@JohnZabroski hai mai pensato che non funzionasse per te? Dipende dall'xml di esempio, se è possibile creare l'xml di esempio con tutte le classi e i membri, non c'è motivo di perdere alcuna classe e membro.
Batmaci,

Il mio punto è che il passaggio 2 non è garantito per funzionare. Ma è un trucco COOL.
John Zabroski,

Risposta meravigliosa Ti meriti alcune birre fredde !!
HenryGuillen17,

14

xsd.exe non funziona bene quando si hanno riferimenti circolari (ovvero un tipo può possedere un elemento del proprio tipo direttamente o indirettamente).

Quando esistono riferimenti circolari, uso Xsd2Code. Xsd2Code gestisce bene i riferimenti circolari e funziona all'interno dell'IDE VS, il che è un grande vantaggio. Ha anche molte funzionalità che puoi usare come generare il codice di serializzazione / deserializzazione. Assicurati di attivare GenerateXMLAttributes se stai comunque generando la serializzazione (altrimenti otterrai eccezioni per l'ordine se non definito su tutti gli elementi).

Né funziona bene con la funzione di scelta. finirai con elenchi / raccolte di oggetti invece del tipo che desideri. Consiglierei di evitare la scelta nel tuo xsd, se possibile, poiché questo non serializza / deserializza bene in una classe fortemente tipizzata. Se non ti interessa, tuttavia, non è un problema.

Qualsiasi funzione in xsd2code viene deserializzata come System.Xml.XmlElement che trovo davvero conveniente, ma potrebbe essere un problema se si desidera oggetti con caratteri forti. Uso spesso qualsiasi quando consento dati di configurazione personalizzati, quindi un XmlElement è comodo da passare a un altro deserializzatore XML che è definito altrove.


Ho aggiunto xsd2code guardando la tua risposta. Dobbiamo cambiare qualcosa affinché si occupi dei riferimenti ai gruppi circolari? Per me non funziona con le proprietà predefinite
Jyotsna Sonawane,

Non ho dovuto fare nulla di speciale perché funzionasse con riferimenti circolari. Se pubblichi l'XML come una nuova domanda e aggiungi un link qui, sono felice di dargli un'occhiata.
VoteCoffee

10

Per una soluzione rapida e pigra , (e non usare affatto VS) prova questi convertitori online:

  • convertitore da xsd a xml qui
  • convertitore xmltocsharp qui

XSD => XML => Classi C #

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

Converti in 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>

Che converte in questa struttura di classe:

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

}

Attenzione! Tieni presente che questo è solo per iniziare, i risultati ovviamente necessitano di perfezionamenti!


Grazie mille. Questo può essere usato come un buon esempio per coloro che stanno imparando XML Schema e XML in .NET
theeranitp

Risposta meravigliosa Ti meriti alcune birre fredde!
HenryGuillen17,

5

Uso XSDin uno script batch per generare .xsdfile e classi XMLdirettamente da :

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

Il comando che ha funzionato nel mio caso è stato:

xsd /c your.xsd 

1

La risposta di Marc Gravells era giusta per me, ma la mia xsd era con estensione .xml. Quando ho usato il programma xsd mi ha dato:
- The table (Amt) cannot be the child table to itself in nested relations.

Come per questo KB325695 ho rinominato l'estensione da .xml a .xsd e ha funzionato bene.


1

ero solito xsd.exe nel prompt dei comandi di Windows.

Tuttavia, poiché il mio xml faceva riferimento a diversi xml online (nel mio caso http://www.w3.org/1999/xlink.xsdquali riferimenti http://www.w3.org/2001/xml.xsd) ho dovuto anche scaricare quegli schemi, metterli nella stessa directory del mio xsd e quindi elencare quei file nel comando:

"C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / classi / lingua: CS your.xsd xlink.xsd xml.xsd


Quello non sarebbe il mercato Amazon XSD, dove per ora costruire le classi :-) Ho dovuto lavorare con loro una volta, mai più li toccherei o farei qualsiasi lavoro in C # usando i file XSD di amazzoni, ci sono un tale casino è irreale.
shawty

@shawty Stavo lavorando con gli standard GIS - WFS e WMS - che sono definiti da grandi XSD circolari con riferimenti incrociati. È stato un gran casino xsd.exeperché non gli piacciono i riferimenti circolari, ma alla fine ho avuto successo.
Aske B.

sì, sarebbe stata la mia seconda ipotesi. Visto anche quelli, il loro non è affatto cattivo come quello delle Amazzoni ... mi dà incubi che ricordano i brividi
shawty

0

Insieme a WSDL, avevo i file xsd. Quanto sopra non ha funzionato nel mio caso ha dato errore. Ha funzionato come segue

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.