Welche Optionen stehen zum Generieren von .NET 4.0 c # -Klassen (Entitäten) aus einer xsd-Datei mit Visual Studio 2010 zur Verfügung?
Welche Optionen stehen zum Generieren von .NET 4.0 c # -Klassen (Entitäten) aus einer xsd-Datei mit Visual Studio 2010 zur Verfügung?
Antworten:
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 /enableDataBinding
kann nützlich sein.
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)
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.
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.
Versuchen Sie für eine schnelle und faule Lösung (und verwenden Sie VS überhaupt nicht) diese Online-Konverter:
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!
Ich verwende XSD
in einem Batch-Skript, um .xsd
Dateien und Klassen XML
direkt 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%
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.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
welche 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
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
wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl
D:\CXTypes.xsd D:\CTypes.xsd
D:\Preferences.xsd