363 Stimmen

Wie generiere ich .NET 4.0 Klassen aus xsd?

Was sind die Optionen zum Generieren von .NET 4.0 C# Klassen (Entities) aus einer XSD-Datei unter Verwendung von Visual Studio 2010?

0 Stimmen

@drzaus Ich hatte das früher funktioniert, aber jetzt, wenn ich eins hinzufüge, wird es als DataSet-Klasse generiert anstelle der Klassen, die ich erwarten würde. Ich füge einfach ein vorhandenes Element hinzu und wähle die XSD-Datei aus.

559voto

Marc Gravell Punkte 970173

Einfach genug; einfach ausführen (am vs Befehlsprompt)

xsd your.xsd /classes

(was your.cs erstellen wird). Beachten Sie jedoch, dass sich die meisten der hier vorhandenen inhärenten Optionen seit 2.0 nicht wesentlich geändert haben

Für die Optionen verwenden Sie xsd /? oder siehe MSDN; zum Beispiel kann /enableDataBinding nützlich sein.

99 Stimmen

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\xsd.exe" /classes /language:CS deine.xsd

4 Stimmen

Gravell wieder zur Rettung! Obwohl diese Antwort zu 100% richtig ist, habe ich es in meinem Fall am einfachsten gefunden, den xsd.exe-Verzeichnispfad zur PATH-Umgebungsvariablen hinzuzufügen. Mein Computer -> Eigenschaften -> Erweitert -> Umgebungsvariablen -> Pfad -- und fügen Sie "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\" hinzu (achten Sie natürlich genau auf die Windows- und .NET-Versionen, die spezifisch für Ihren Computer sind) -- frohes Codieren!

21 Stimmen

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

59voto

Serge Wautier Punkte 20814

Xsd.exe wie von Marc Gravell erwähnt. Meiner Meinung nach der schnellste Weg, um loszulegen.

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

xsd2code VS-Add-In (Codeplex)

10 Stimmen

Ich konnte xsd2code überhaupt nicht zum Laufen bringen. xsd.exe ist robuster, hat jedoch Schwierigkeiten mit Schemas, die "kreisförmige" Gruppen haben.

0 Stimmen

Xsd2code funktioniert in Visual Studio 2017 und war genau das, wonach ich gesucht habe. Sie müssen es zuerst im Programmdateien (x86) Verzeichnis ausführen und dann den VSIX-Installer verwenden. Dann funktioniert es hervorragend. Es war WEIT ÜBERLEGEN dem xsd.exe, das Arrays[][] anstatt von Listen generierte. Ich hatte eine riesige .xsd Datei und musste Klassen erstellen, um das XML zu serialisieren. xsd.exe würde keinen serialisierbaren Code generieren (.NET Core 2) und xsd2code hat super funktioniert.

1 Stimmen

Die aktualisierte Version von XSD2CODE für Visual Studio 2015 und 2017 ist hier: marketplace.visualstudio.com/…

52voto

Emil Punkte 5662

Hier zeige ich Ihnen den einfachsten Weg, Vs2017 und Vs2019 zu verwenden Öffnen Sie Ihre XSD-Datei mit Visual Studio und generieren Sie eine Beispieldatei wie in der URL vorgeschlagen.

  1. Wenn Sie Ihre XSD im Design-Modus geöffnet haben, klicken Sie im XML-Schema-Explorer auf Bildbeschreibung hier eingeben

2. Innerhalb des "XML-Schema-Explorers" scrollen Sie ganz nach unten, um den Root-/Datenknoten zu finden. Klicken Sie mit der rechten Maustaste auf den Root-/Datenknoten und es wird "Beispiel-XML generieren" angezeigt. Wenn es nicht angezeigt wird, bedeutet dies, dass Sie sich nicht im Daten-Elementknoten, sondern in einem der Datendefinitions-Knoten befinden.

Bildbeschreibung hier eingeben

  1. Kopieren Sie Ihr generiertes XML in die Zwischenablage
  2. Erstellen Sie eine neue leere Klasse in Ihrer Lösung und löschen Sie die Klassendefinition. Nur der Namespace sollte bleiben
  3. Wenn sich Ihr Mauszeiger innerhalb Ihrer Klasse befindet, wählen Sie BEARBEITEN-> Einfügen spezial-> Als Klassen einfügen

2 Stimmen

Dies ist leider nicht garantiert, alle Klassen zu generieren, aber es ist ein COOLER Trick.

1 Stimmen

@JohnZabroski hattest du jemals einen Fall, bei dem es nicht für dich funktioniert hat? Es hängt vom Beispiels-XML ab, wenn du ein Beispiels-XML mit allen Klassen und Mitgliedern erstellen kannst, besteht kein Grund, eine Klasse oder ein Mitglied zu verpassen.

0 Stimmen

Mein Punkt ist, dass Schritt 2 nicht garantiert funktioniert. Aber es ist ein COOLER Trick.

16voto

cnom Punkte 2601

Für eine schnelle und faule Lösung (und ohne VS überhaupt zu verwenden) probieren Sie diese Online-Konverter aus:

  • xsd-to-xml-converter hier
  • xmltocsharp converter hier

XSD => XML => C# Klassen

Beispiel XSD:

Konvertiert zu XML:

  string

    string
    string
    string
    string

    string
    string
    3229484693
    -6894.465094196054907

    string
    string
    2181272155
    -2645.585094196054907

    string
    string
    2485046602
    4023.034905803945093

    string
    string
    1342091380
    -810.825094196054907

Was zu dieser Klassenstruktur konvertiert:

   /* 
    Lizenziert unter der Apache-Lizenz, 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 { 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; }
    }

}

Achtung! Beachten Sie, dass dies nur als Startpunkt gedacht ist, die Ergebnisse benötigen natürlich Verfeinerungen!

0 Stimmen

Vielen Dank. Dies kann als gutes Beispiel für diejenigen verwendet werden, die XML-Schema und XML in .NET lernen.

0 Stimmen

Wunderbare Antwort. Du hast ein paar kalte Biere verdient!

0 Stimmen

Ja, but es ist viel einfacher, XSD in C# mit Visual Studio oder CMD zu konvertieren: qawithexperts.com/article/c-sharp/…

15voto

VoteCoffee Punkte 3834

Xsd.exe funktioniert nicht gut, wenn zirkuläre Verweise vorliegen (d. h. ein Typ kann ein Element seines eigenen Typs direkt oder indirekt besitzen).

Bei zirkulären Verweisen verwende ich Xsd2Code. Xsd2Code behandelt zirkuläre Verweise gut und funktioniert innerhalb der VS IDE, was ein großer Vorteil ist. Es hat auch viele Funktionen, die Sie nutzen können, wie das Generieren des Serialisierungs-/Deserialisierungscodes. Stellen Sie sicher, dass Sie GenerateXMLAttributes aktivieren, wenn Sie die Serialisierung generieren (sonst erhalten Sie Ausnahmen für die Reihenfolge, wenn sie nicht auf allen Elementen definiert ist).

Beide funktionieren nicht gut mit der Choice-Funktion. Sie werden Listen/Sammlungen von Objekten erhalten, anstelle des gewünschten Typs. Ich würde empfehlen, Choice in Ihrem xsd zu vermeiden, wenn möglich, da dies nicht gut in eine stark typisierte Klasse serialisiert/deserialisiert wird. Wenn Sie sich jedoch nicht darum kümmern, dann ist es kein Problem.

Das Any-Feature in xsd2code wird als System.Xml.XmlElement deserialisiert, was ich wirklich praktisch finde, aber ein Problem sein kann, wenn Sie stark typisierte Objekte möchten. Ich verwende Any oft, wenn benutzerdefinierte Konfigurationsdaten zugelassen sind, sodass ein XmlElement praktisch ist, um es an einen anderen XML-Deserializer weiterzugeben, der an anderer Stelle benutzerdefiniert definiert ist.

0 Stimmen

Ich habe xsd2code hinzugefügt, indem ich mir deine Antwort angesehen habe. Müssen wir etwas ändern, damit es sich um zirkuläre Gruppenverweise kümmert? Es funktioniert bei mir nicht mit den Standardeigenschaften.

0 Stimmen

Ich musste nichts Besonderes tun, damit es mit zirkulären Referenzen funktioniert. Wenn Sie das XML als neue Frage posten und hier einen Link hinzufügen, schaue ich mir das gerne an.

0 Stimmen

Es hat meinen Fall gelöst. Vielen Dank!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X