@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.
„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:
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
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 .
Po otwarciu pliku xsd w widoku projektu, jak poniżej, kliknij Eksplorator schematów xml
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.
Skopiuj wygenerowany plik Xml do schowka
Utwórz nową pustą klasę w swoim rozwiązaniu i usuń definicję klasy. Powinna pozostać tylko przestrzeń nazw
Podczas gdy wskaźnik myszy skupi się w klasie, wybierz EDYCJA-> Wklej specjalnie-> Wklej Xml jako klasy
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.
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:
<?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>
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")]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;}}}
Uwaga! Weź pod uwagę, że to dopiero początek, wyniki oczywiście wymagają udoskonalenia!
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.
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
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
Odpowiedzi:
wystarczająco proste; po prostu uruchom (w wierszu polecenia vs)
(który utworzy
your.cs
). Zauważ jednak, że większość wewnętrznych opcji tutaj niewiele się zmieniła od wersji 2.0Aby uzyskać opcje, użyj
xsd /?
lub zobacz MSDN ; na przykład/enableDataBinding
może być przydatne.źródło
xsd schema1.xsd schema2.xsd schema3.xsd /c
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)
źródło
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 .
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.
źródło
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.
źródło
Aby uzyskać szybkie i leniwe rozwiązanie (i wcale nie używać VS), wypróbuj następujące konwertery online:
Przykład XSD:
Konwertuje na XML:
Który konwertuje do tej struktury klas:
Uwaga! Weź pod uwagę, że to dopiero początek, wyniki oczywiście wymagają udoskonalenia!
źródło
Używam
XSD
w skrypcie wsadowym do generowania.xsd
plików i klasXML
bezpośrednio z :źródło
Polecenie, które zadziałało w moim przypadku to:
źródło
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.
źródło
Użyłem
xsd.exe
w 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.xsd
jakich odnośnikówhttp://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:źródło
xsd.exe
ponieważ nie lubi okrągłych referencji, ale w końcu mi się udało.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
źródło