Wie generiere ich .NET 4.0-Klassen aus xsd?

317

Welche Optionen stehen zum Generieren von .NET 4.0 c # -Klassen (Entitäten) aus einer xsd-Datei mit Visual Studio 2010 zur Verfügung?

Bastien Vandamme
quelle
@drzaus Ich hatte diese Arbeit in der Vergangenheit, aber jetzt, wenn ich eine hinzufüge, wird sie als DataSet-Klasse anstelle der Klassen generiert, die ich erwarten würde. Ich füge einfach ein vorhandenes Element hinzu und wähle die XSD-Datei aus.
msmucker0527

Antworten:

490

einfach genug; einfach ausführen (an der Eingabeaufforderung vs)

xsd your.xsd /classes

(was schaffen wird your.cs). Beachten Sie jedoch, dass sich die meisten intrinsischen Optionen hier seit 2.0 nicht wesentlich geändert haben

Verwenden Sie für die Optionen MSDNxsd /? oder siehe MSDN . zum Beispiel /enableDataBindingkann nützlich sein.

Marc Gravell
quelle
83
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ V8.1A \ bin \ netfx 4.5.1 Tools \ xsd.exe" / classes / Sprache: CS your.xsd
GeorgesC
2
Gravell wieder zur Rettung! Obwohl diese Antwort zu 100% richtig ist, fand ich es in meinem Fall am einfachsten, den Verzeichnispfad xsd.exe zur Umgebungsvariablen PATH hinzuzufügen. Mein Computer -> Eigenschaften -> Erweitert -> Umgebungsvariablen -> Pfad - und fügen Sie "C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" hinzu (natürlich Achten Sie genau auf die Windows- und .NET-Versionen, die für Ihren Computer spezifisch sind.
Pimbrouwers
15
Für den Fall, dass Sie mehrere miteinander verknüpfte Schemadefinitionen haben, benennen Sie sie einfach alle. xsd schema1.xsd schema2.xsd schema3.xsd /c
Mivra
56

xsd.exe wie von Marc Gravell erwähnt. Der schnellste Weg, um IMO zum Laufen zu bringen.

Oder wenn Sie mehr Flexibilität / Optionen benötigen:

xsd2code VS Add-In (Codeplex)

Serge Wautier
quelle
10
Ich konnte xsd2code überhaupt nicht für mich arbeiten lassen. xsd.exe ist robuster, hat jedoch Probleme mit Schemas mit "kreisförmigen" Gruppen.
Jeff
xsd2code funktioniert in Visual Studio 2017 und war genau das, wonach ich gesucht habe. Sie müssen es zuerst im Programmdateiverzeichnis (x86) ausführen und dann das vsix-Installationsprogramm verwenden. dann funktioniert es super. Es war weit über der xsd.exe, die Arrays [] [] anstelle von Listen generierte. Ich hatte eine riesige .xsd und ich muss Klassen erstellen, um das XML zu serialisieren. xsd.exe würde keinen serialisierbaren Code (.net Core 2) generieren und xsd2code hat großartig funktioniert
hanzolo
Die aktualisierte Version von XSD2CODE für Visual Studio 2015 und 2017 ist hier: marketark.visualstudio.com/…
Gianpiero
Der ursprüngliche xsd2code ist jetzt xsd2code ++. Die Community Edition ist auf dem VS Marketplace
Gerd K
16

Ich zeige Ihnen hier den einfachsten Weg mit Vs2017 und Vs2019 Öffnen Sie Ihre xsd mit Visual Studio und generieren Sie eine XML-Beispieldatei wie in der vorgeschlagenen URL .

  1. Wenn Sie Ihre xsd in der Entwurfsansicht wie folgt geöffnet haben, klicken Sie auf xml schema explorer Geben Sie hier die Bildbeschreibung ein

2. Scrollen Sie im „XML Schema Explorer“ ganz nach unten, um den Stamm- / Datenknoten zu finden. Klicken Sie mit der rechten Maustaste auf den Stamm- / Datenknoten und es wird "Beispiel-XML generieren" angezeigt. Wenn es nicht angezeigt wird, bedeutet dies, dass Sie sich nicht auf dem Datenelementknoten befinden, sondern auf einem der Datendefinitionsknoten.

Geben Sie hier die Bildbeschreibung ein

  1. Kopieren Sie Ihre generierte XML in die Zwischenablage
  2. Erstellen Sie eine neue leere Klasse in Ihrer Lösung und löschen Sie die Klassendefinition. Es sollte nur der Namespace übrig bleiben
  3. Während sich Ihr Mauszeiger auf Ihre Klasse konzentriert, wählen Sie BEARBEITEN-> Spezial einfügen-> XML als Klassen einfügen
Batmaci
quelle
Leider werden nicht alle Klassen garantiert, aber es ist ein cooler Trick.
John Zabroski
1
@ JohnZabroski Hattest du einen Fall, dass es bei dir nicht funktioniert hat? Es hängt von der Beispiel-XML ab. Wenn Sie eine Beispiel-XML mit allen Klassen und Mitgliedern erstellen können, gibt es keinen Grund, eine Klasse und ein Mitglied zu verpassen.
Batmaci
Mein Punkt ist, dass Schritt 2 nicht garantiert funktioniert. Aber es ist ein cooler Trick.
John Zabroski
14

xsd.exe funktioniert nicht gut, wenn Sie Zirkelverweise haben (dh ein Typ kann direkt oder indirekt ein Element seines eigenen Typs besitzen).

Wenn Zirkelverweise vorhanden sind, verwende ich Xsd2Code. Xsd2Code verarbeitet Zirkelverweise gut und funktioniert innerhalb der VS-IDE, was ein großes Plus ist. Es hat auch viele Funktionen, die Sie verwenden können, wie das Generieren des Serialisierungs- / Deserialisierungscodes. Stellen Sie sicher, dass Sie die GenerateXMLAttributes aktivieren, wenn Sie die Serialisierung generieren (andernfalls erhalten Sie Ausnahmen für die Reihenfolge, wenn nicht für alle Elemente definiert).

Beides funktioniert nicht gut mit der Auswahlfunktion. Am Ende erhalten Sie Listen / Sammlungen von Objekten anstelle des gewünschten Typs. Ich würde empfehlen, die Auswahl in Ihrer xsd nach Möglichkeit zu vermeiden, da dies nicht gut zu einer stark typisierten Klasse serialisiert / deserialisiert. Wenn Sie sich jedoch nicht darum kümmern, ist dies kein Problem.

Die Funktion any in xsd2code deserialisiert als System.Xml.XmlElement, was ich sehr praktisch finde, aber möglicherweise ein Problem darstellt, wenn Sie stark typisierte Objekte wünschen. Ich verwende häufig alle, wenn ich benutzerdefinierte Konfigurationsdaten zulasse, sodass ein XmlElement bequem an einen anderen XML-Deserializer übergeben werden kann, der an anderer Stelle benutzerdefiniert definiert ist.

VoteCoffee
quelle
Ich habe xsd2code hinzugefügt, indem ich mir Ihre Antwort angesehen habe. Müssen wir etwas ändern, um zirkuläre Gruppenreferenzen zu bearbeiten? Es funktioniert nicht für mich mit Standardeigenschaften
Jyotsna Sonawane
Ich musste nichts Besonderes tun, um mit Zirkelverweisen zu arbeiten. Wenn Sie die XML als neue Frage posten und hier einen Link hinzufügen, schaue ich sie mir gerne an.
VoteCoffee
9

Versuchen Sie für eine schnelle und faule Lösung (und verwenden Sie VS überhaupt nicht) diese Online-Konverter:

  • xsd-zu-xml-Konverter hier
  • xmltocsharp Konverter hier

XSD => XML => C # -Klassen

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

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

Was in diese Klassenstruktur konvertiert:

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

}

Beachtung! Berücksichtigen Sie, dass dies nur für den Einstieg gedacht ist. Die Ergebnisse müssen natürlich verfeinert werden!

cnom
quelle
Ich danke dir sehr. Dies kann als gutes Beispiel für diejenigen verwendet werden, die XML-Schema und XML in .NET
lernen
5

Ich verwende XSDin einem Batch-Skript, um .xsdDateien und Klassen XMLdirekt zu generieren :

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
quelle
2

Der Befehl, der in meinem Fall funktionierte, war:

xsd /c your.xsd 
Melchia
quelle
1

Marc Gravells Antwort war richtig für mich, aber meine xsd war mit der Erweiterung von .xml. Als ich das xsd-Programm benutzte, gab es:
- The table (Amt) cannot be the child table to itself in nested relations.

Gemäß dieser KB325695 habe ich die Erweiterung von .xml in .xsd umbenannt und es hat gut funktioniert.

Igoris Azanovas
quelle
1

Ich habe xsd.exein der Windows-Eingabeaufforderung verwendet.

Da meine XML-Datei jedoch auf mehrere Online-XML- Dateien verwies (in meinem Fall auf http://www.w3.org/1999/xlink.xsdwelche http://www.w3.org/2001/xml.xsd), musste ich diese Schaltpläne auch herunterladen, sie in dasselbe Verzeichnis wie meine xsd stellen und diese Dateien dann im Befehl auflisten:

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

Fragen Sie B.
quelle
Das wäre nicht der Amazon-Marktplatz für XSDs, auf dem Sie vorerst Klassen erstellen würden :-) Ich musste einmal mit ihnen arbeiten, ich werde sie nie wieder berühren oder in C # mit Amazon XSD-Dateien arbeiten, das gibt es so ein Durcheinander ist es unwirklich.
Shawty
@shawty Ich habe mit GIS-Standards - WFS und WMS - gearbeitet, die durch große, kreisförmige XSDs mit Querverweisen definiert sind. War ein großes Durcheinander, xsd.exeweil es keine Zirkelverweise mag, aber ich war am Ende erfolgreich.
Aske B.
Ja, das wäre meine zweite Vermutung gewesen. Gesehen auch für diese thier nicht annähernd so schlimm , wie Amazonen Sachen aber ... gibt mir Albträume erinnern Schauder
Shawty
0

Zusammen mit WSDL hatte ich xsd-Dateien. Das obige hat in meinem Fall nicht funktioniert, gab Fehler. Es hat wie folgt funktioniert

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
quelle