Quali sono le opzioni per generare classi (entità) .NET 4.0 c # da un file xsd, usando Visual Studio 2010?
Quali sono le opzioni per generare classi (entità) .NET 4.0 c # da un file xsd, usando Visual Studio 2010?
Risposte:
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 /enableDataBinding
può essere utile.
xsd schema1.xsd schema2.xsd schema3.xsd /c
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)
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.
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.
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.
Per una soluzione rapida e pigra , (e non usare affatto VS) prova questi convertitori online:
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!
Uso XSD
in uno script batch per generare .xsd
file e classi XML
direttamente 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%
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.
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.xsd
quali 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
xsd.exe
perché non gli piacciono i riferimenti circolari, ma alla fine ho avuto successo.
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