Jak wygenerować klasy .NET 4.0 z xsd?

317

Jakie są opcje generowania klas (encji) .NET 4.0 c # z pliku xsd przy użyciu programu Visual Studio 2010?

Bastien Vandamme
źródło
@drzaus Miałem tę pracę w przeszłości, ale teraz, gdy ją dodam, generuje ją jako klasę DataSet zamiast klas, których bym się spodziewał. Właśnie dodałem istniejący element i wybrałem plik XSD.
msmucker0527

Odpowiedzi:

490

wystarczająco proste; po prostu uruchom (w wierszu polecenia vs)

xsd your.xsd /classes

(który utworzy your.cs). Zauważ jednak, że większość wewnętrznych opcji tutaj niewiele się zmieniła od wersji 2.0

Aby uzyskać opcje, użyj xsd /?lub zobacz MSDN ; na przykład /enableDataBindingmoże być przydatne.

Marc Gravell
źródło
83
„C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe” / class / language: CS your.xsd
GeorgesC
2
Ponownie na ratunek! Chociaż ta odpowiedź jest w 100% prawidłowa, w moim przypadku najłatwiej było dodać ścieżkę katalogu xsd.exe do zmiennej środowiskowej PATH. Mój komputer -> właściwości -> zaawansowane -> zmienne środowiskowe -> Ścieżka - i dodaj „C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \” (oczywiście zwróć szczególną uwagę na wersje Windows i .NET specyficzne dla twojej maszyny) - życzymy udanego kodowania!
pimbrouwers
15
W przypadku, gdy masz kilka powiązanych ze sobą definicji schematów, po prostu nazwij je wszystkie. xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra
56

xsd.exe jak wspomniał Marc Gravell. Najszybszy sposób na uruchomienie i uruchomienie IMO.

Lub jeśli potrzebujesz większej elastyczności / opcji:

xsd2code VS dodatek (Codeplex)

Serge Wautier
źródło
10
W ogóle nie mogłem zmusić xsd2code do pracy. xsd.exe jest bardziej niezawodny, ale boryka się ze schematami, które mają „okrągłe” grupy.
Jeff
xsd2code działa w Visual Studio 2017 i było dokładnie tym, czego szukałem. musisz go najpierw uruchomić w katalogu plików programu (x86), a następnie użyć instalatora vsix. to działa świetnie. to było DALEJ SUPERIOUR dla xsd.exe, który wygenerował tablice [] [] zamiast lists.I miał gigantyczny .xsd i muszę stworzyć klasy do serializacji XML. xsd.exe nie wygenerowałby kodu możliwego do serializacji (.net core 2), a xsd2code działał świetnie
hanzolo,
Zaktualizowana wersja XSD2CODE dla Visual Studio 2015 e 2017 jest tutaj: marketplace.visualstudio.com/...
Gianpiero
Oryginalny kod xsd2 to teraz xsd2code ++. Wersja społecznościowa jest dostępna na VS Marketplace
Gerd K.
17

Pokażę ci tutaj najłatwiejszy sposób przy użyciu Vs2017 i Vs2019 Otwórz xsd w Visual Studio i wygeneruj przykładowy plik xml jak w sugerowanym adresie URL .

  1. Po otwarciu pliku xsd w widoku projektu, jak poniżej, kliknij Eksplorator schematów xml wprowadź opis zdjęcia tutaj

2. W „XML Schema Explorer” przewiń w dół, aby znaleźć węzeł główny / danych. Kliknij prawym przyciskiem myszy węzeł główny / danych, a wyświetli się „Generuj przykładowy XML”. Jeśli się nie pokazuje, oznacza to, że nie jesteś w węźle elementu danych, ale jesteś w dowolnym węźle definicji danych.

wprowadź opis zdjęcia tutaj

  1. Skopiuj wygenerowany plik Xml do schowka
  2. Utwórz nową pustą klasę w swoim rozwiązaniu i usuń definicję klasy. Powinna pozostać tylko przestrzeń nazw
  3. Podczas gdy wskaźnik myszy skupi się w klasie, wybierz EDYCJA-> Wklej specjalnie-> Wklej Xml jako klasy
batmaci
źródło
Niestety nie gwarantuje się wygenerowania wszystkich klas, ale jest to CHŁODNA sztuczka.
John Zabroski
1
@JohnZabroski czy miałeś przypadek, że to nie zadziałało? Zależy to od przykładowego pliku XML, jeśli możesz utworzyć przykładowy plik XML ze wszystkimi klasami i członkami, nie ma powodu, aby pominąć dowolną klasę i członka.
batmaci
Chodzi mi o to, że krok 2 nie gwarantuje, że zadziała. Ale to fajna sztuczka.
John Zabroski
Cudowna odpowiedź. Zasługujesz na zimne piwo !!
HenryGuillen17
14

xsd.exe nie działa dobrze, gdy masz odwołania cykliczne (tzn. typ może posiadać element swojego typu bezpośrednio lub pośrednio).

Kiedy istnieją odwołania cykliczne, używam Xsd2Code. Xsd2Code dobrze radzi sobie z referencjami cyklicznymi i działa w VS IDE, co jest dużym plusem. Ma również wiele funkcji, z których można korzystać, np. Generowanie kodu serializacji / deserializacji. Pamiętaj jednak, aby włączyć GenerateXMLAttributes, jeśli generujesz serializację (w przeciwnym razie otrzymasz wyjątki dotyczące zamawiania, jeśli nie zostaną zdefiniowane we wszystkich elementach).

Żadne z nich nie działa dobrze z funkcją wyboru. skończysz z listami / kolekcjami obiektów zamiast pożądanego typu. Zalecam unikanie wyboru w xsd, jeśli to możliwe, ponieważ nie powoduje to serializacji / deserializacji w silnie typowanej klasie. Jeśli jednak cię to nie obchodzi, to nie stanowi problemu.

Każda funkcja w xsd2code deserializuje się jako System.Xml.XmlElement, co uważam za bardzo wygodne, ale może stanowić problem, jeśli chcesz mocnych obiektów. Często używam dowolnego, gdy zezwalam na niestandardowe dane konfiguracyjne, więc XmlElement jest wygodny do przekazania do innego deserializatora XML, który jest niestandardowo zdefiniowany w innym miejscu.

VoteCoffee
źródło
Dodałem xsd2code, patrząc na twoją odpowiedź. Czy musimy coś zmienić, aby zająć się referencjami grup okólnych? Nie działa dla mnie z domyślnymi właściwościami
Jyotsna Sonawane
Nie musiałem robić nic specjalnego, aby działał z referencjami cyklicznymi. Jeśli opublikujesz xml jako nowe pytanie i dodasz link tutaj, chętnie się temu przyjrzę.
VoteCoffee
10

Aby uzyskać szybkie i leniwe rozwiązanie (i wcale nie używać VS), wypróbuj następujące konwertery online:

  • xsd-to-xml-converter tutaj
  • konwerter xmltocsharp tutaj

XSD => XML => klasy C #

Przykład 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>

Konwertuje na 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>

Który konwertuje do tej struktury klas:

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

}

Uwaga! Weź pod uwagę, że to dopiero początek, wyniki oczywiście wymagają udoskonalenia!

Cnom
źródło
Dziękuję bardzo. Można to wykorzystać jako dobry przykład dla osób uczących się schematu XML i XML w .NET
theeranitp
Cudowna odpowiedź. Zasługujesz na zimne piwo!
HenryGuillen17
5

Używam XSDw skrypcie wsadowym do generowania .xsdplików i klas XMLbezpośrednio z :

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
źródło
2

Polecenie, które zadziałało w moim przypadku to:

xsd /c your.xsd 
Melchia
źródło
1

Odpowiedź Marca Gravellsa była dla mnie odpowiednia, ale mój xsd był z rozszerzeniem .xml. Kiedy użyłem programu xsd, dał:
- The table (Amt) cannot be the child table to itself in nested relations.

Zgodnie z tym KB325695 zmieniłem nazwę rozszerzenia z .xml na .xsd i działało dobrze.

Igoris Azanovas
źródło
1

Użyłem xsd.exew wierszu polecenia systemu Windows.

Ponieważ jednak mój plik XML odwoływał się do kilku plików XML w trybie online (w moim przypadku do http://www.w3.org/1999/xlink.xsdjakich odnośników http://www.w3.org/2001/xml.xsd) musiałem również pobrać te schematy, umieścić je w tym samym katalogu co plik xsd, a następnie wyświetlić listę tych plików w poleceniu:

„C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe” / class / language: CS your.xsd xlink.xsd xml.xsd

Aske B.
źródło
To by się nie zdarzyło na rynku XSD w Amazon, gdzie teraz budujesz klasy :-) Musiałem z nimi raz pracować, nigdy więcej ich nie dotknę ani nie będę wykonywać żadnej pracy w C # przy użyciu plików XSD amazonów, są taki bałagan to nierealne.
shawty
@ shawty Pracowałem ze standardami GIS - WFS i WMS - które są zdefiniowane przez duże, okrągłe XSD. Był duży bałagan, xsd.exeponieważ nie lubi okrągłych referencji, ale w końcu mi się udało.
Aske B.,
tak, to byłby mój drugi przypuszczenie. Widziałem też te, choć nie tak blisko, jak rzeczy Amazonki ... daje mi koszmary pamiętające dreszcze
shawty
0

Wraz z WSDL miałem pliki xsd. Powyższe nie działało w moim przypadku dało błąd. Działa w następujący sposób

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
źródło