Jakie są opcje generowania klas (encji) .NET 4.0 c # z pliku xsd przy użyciu programu Visual Studio 2010?
Jakie są opcje generowania klas (encji) .NET 4.0 c # z pliku xsd przy użyciu programu Visual Studio 2010?
Odpowiedzi:
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 /enableDataBinding
może być przydatne.
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)
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.
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.
Aby uzyskać szybkie i leniwe rozwiązanie (i wcale nie używać VS), wypróbuj następujące konwertery online:
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!
Używam XSD
w skrypcie wsadowym do generowania .xsd
plików i klas XML
bezpoś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%
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.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ó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
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
wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl
D:\CXTypes.xsd D:\CTypes.xsd
D:\Preferences.xsd