@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.
"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:
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
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 .
Wenn Sie Ihre xsd in der Entwurfsansicht wie folgt geöffnet haben, klicken Sie auf xml schema explorer
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.
Kopieren Sie Ihre generierte XML in die Zwischenablage
Erstellen Sie eine neue leere Klasse in Ihrer Lösung und löschen Sie die Klassendefinition. Es sollte nur der Namespace übrig bleiben
Während sich Ihr Mauszeiger auf Ihre Klasse konzentriert, wählen Sie BEARBEITEN-> Spezial einfügen-> XML als Klassen einfügen
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.
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:
<?xml version="1.0" encoding="utf-8"?><!--Created with LiquidTechnologiesOnlineTools1.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")]publicclassShipto{[XmlElement(ElementName="name")]publicstringName{get;set;}[XmlElement(ElementName="address")]publicstringAddress{get;set;}[XmlElement(ElementName="city")]publicstringCity{get;set;}[XmlElement(ElementName="country")]publicstringCountry{get;set;}}[XmlRoot(ElementName="item")]publicclassItem{[XmlElement(ElementName="title")]publicstringTitle{get;set;}[XmlElement(ElementName="note")]publicstringNote{get;set;}[XmlElement(ElementName="quantity")]publicstringQuantity{get;set;}[XmlElement(ElementName="price")]publicstringPrice{get;set;}}[XmlRoot(ElementName="shiporder")]publicclassShiporder{[XmlElement(ElementName="orderperson")]publicstringOrderperson{get;set;}[XmlElement(ElementName="shipto")]publicShiptoShipto{get;set;}[XmlElement(ElementName="item")]publicList<Item>Item{get;set;}[XmlAttribute(AttributeName="noNamespaceSchemaLocation",Namespace="http://www.w3.org/2001/XMLSchema-instance")]publicstringNoNamespaceSchemaLocation{get;set;}[XmlAttribute(AttributeName="orderid")]publicstringOrderid{get;set;}[XmlAttribute(AttributeName="xsi",Namespace="http://www.w3.org/2000/xmlns/")]publicstringXsi{get;set;}}}
Beachtung! Berücksichtigen Sie, dass dies nur für den Einstieg gedacht ist. Die Ergebnisse müssen natürlich verfeinert werden!
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.
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
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
Antworten:
einfach genug; einfach ausführen (an der Eingabeaufforderung vs)
(was schaffen wird
your.cs
). Beachten Sie jedoch, dass sich die meisten intrinsischen Optionen hier seit 2.0 nicht wesentlich geändert habenVerwenden Sie für die Optionen MSDN
xsd /?
oder siehe MSDN . zum Beispiel/enableDataBinding
kann nützlich sein.quelle
xsd schema1.xsd schema2.xsd schema3.xsd /c
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)
quelle
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 .
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.
quelle
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.
quelle
Versuchen Sie für eine schnelle und faule Lösung (und verwenden Sie VS überhaupt nicht) diese Online-Konverter:
Beispiel XSD:
Konvertiert in XML:
Was in diese Klassenstruktur konvertiert:
Beachtung! Berücksichtigen Sie, dass dies nur für den Einstieg gedacht ist. Die Ergebnisse müssen natürlich verfeinert werden!
quelle
Ich verwende
XSD
in einem Batch-Skript, um.xsd
Dateien und KlassenXML
direkt zu generieren :quelle
Der Befehl, der in meinem Fall funktionierte, war:
quelle
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.
quelle
Ich habe
xsd.exe
in 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.xsd
welchehttp://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:quelle
xsd.exe
weil es keine Zirkelverweise mag, aber ich war am Ende erfolgreich.Zusammen mit WSDL hatte ich xsd-Dateien. Das obige hat in meinem Fall nicht funktioniert, gab Fehler. Es hat wie folgt funktioniert
quelle