web-dev-qa-db-ger.com

Wie generiert man .NET 4.0-Klassen aus xsd?

Welche Optionen gibt es, um .NET 4.0-C # -Klassen (Entitäten) aus einer Xsd-Datei mit Visual Studio 2010 zu generieren?

263

einfach genug; einfach ausführen (bei der vs-Eingabeaufforderung)

xsd your.xsd /classes

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

Verwenden Sie für die Optionen xsd /? oder siehe MSDN ; /enableDataBinding kann beispielsweise nützlich sein.

428
Marc Gravell

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)

53
Serge Wautier

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

Wenn Zirkelverweise vorhanden sind, verwende ich Xsd2Code. Xsd2Code verarbeitet Kreisreferenzen gut und arbeitet innerhalb der VS IDE, was ein großer Vorteil ist. Es bietet auch eine Reihe von Funktionen, die Sie verwenden können, z. B. das Generieren des Serialisierungs-/Deserialisierungscodes. Stellen Sie sicher, dass Sie GenerateXMLAttributes aktivieren, wenn Sie die Serialisierung generieren (andernfalls erhalten Sie Ausnahmen für die Reihenfolge, wenn nicht für alle Elemente definiert).

Weder funktioniert mit der Auswahlfunktion gut. Sie erhalten am Ende Listen/Sammlungen von Objekten anstelle des gewünschten Typs. Ich empfehle, wenn möglich, die Auswahl in Ihrem xsd zu vermeiden, da dies nicht gut in eine stark typisierte Klasse serialisiert/deserialisiert wird. Wenn dir das aber egal ist, dann ist das kein Problem.

Die Funktion in xsd2code wird als System.Xml.XmlElement deserialisiert, was ich sehr praktisch finde, aber ein Problem sein kann, wenn Sie stark typisierte Objekte wünschen. Ich verwende oft beliebiges, wenn ich benutzerdefinierte Konfigurationsdaten zulasse. Ein XmlElement kann daher bequem an einen anderen XML-Deserializer übergeben werden, der an anderer Stelle benutzerdefiniert definiert ist.

14
VoteCoffee

Ich verwende XSD in einem Batch-Skript, um .xsd-Datei und Klassen direkt aus XML 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%
3
hdoghmen

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

Aus diesem Grund KB325695 Ich habe die Erweiterung von .xml in .xsd umbenannt und es hat einwandfrei funktioniert.

1
Igoris Azanovas

Der Befehl, der in meinem Fall funktionierte, war:

xsd /c your.xsd 
0
Melchia

Ich habe xsd.exe in der Windows-Eingabeaufforderung verwendet.

Da mein XML-Code jedoch mehrere Online-XML-Dateien referenzierte (in meinem Fall http://www.w3.org/1999/xlink.xsd, die http://www.w3.org/2001/xml.xsd referenzieren), musste ich auch diese Schaltpläne herunterladen, sie in demselben Verzeichnis wie mein xsd ablegen 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

0
Aske B.

Für eine schnelle und faule Lösung (und nicht mit VS) sollten Sie diese Online-Konverter verwenden:

  • xsd-to-xml-converter hier
  • xmltocsharp converter 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 nach 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>

Welche konvertiert in diese Klassenstruktur:

   /* 
    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 ersten Schritt gilt, die Ergebnisse offensichtlich müssen verfeinert werden!

0
cnom

Zusammen mit WSDL hatte ich XSD-Dateien. Das obige funktionierte in meinem Fall nicht 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 
0
Hamit YILDIRIM