Xsd से .NET 4.0 क्लास कैसे जनरेट करें?


317

Visual Studio 2010 का उपयोग करके एक xsd फ़ाइल से .NET 4.0 c # कक्षाएं (निकाय) बनाने के लिए क्या विकल्प हैं?


@drzaus मैं यह काम अतीत में किया था, लेकिन अब जब मैं इसे जोड़ता हूं तो यह उन कक्षाओं के बजाय डेटासेट वर्ग के रूप में उत्पन्न होता है, जिनकी मुझे उम्मीद थी। मैं अभी एक मौजूदा आइटम जोड़ता हूं और XSD फ़ाइल का चयन करता हूं।
msmucker0527

जवाबों:


490

काफी सरल; बस चलाएं (बनाम कमांड प्रॉम्प्ट पर)

xsd your.xsd /classes

(जो पैदा करेगा your.cs)। हालाँकि, ध्यान दें कि यहाँ अधिकांश आंतरिक विकल्प 2.0 से बहुत अधिक नहीं बदले हैं

विकल्पों के लिए, MSDN का उपयोग करें xsd /?या देखें ; उदाहरण के लिए /enableDataBindingउपयोगी हो सकता है।


83
"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 उपकरण \ xsd.exe" / classes / भाषा: CS your.xsd
GeorgesC

2
बचाव के लिए फिर से बजरी! यद्यपि यह उत्तर 100% सही है, लेकिन मेरे मामले में मुझे PATH पर्यावरण चर में xsd.exe निर्देशिका पथ को जोड़ना आसान लगा। मेरा कंप्यूटर -> गुण -> उन्नत -> पर्यावरण चर -> पथ - और "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 उपकरण जोड़ें" (निश्चित रूप से) अपनी मशीन के लिए दोनों विंडोज़ और .NET संस्करणों पर पूरा ध्यान दें) - हैप्पी कोडिंग!
१६:२६ को

15
मामले के लिए आपके पास कई इंटरलिम्ड स्कीमा परिभाषाएं हैं, बस उन सभी को नाम दें। xsd schema1.xsd schema2.xsd schema3.xsd /c
मिवरा

56

मार्क Gravell द्वारा वर्णित के रूप में xsd.exe। IMO को चलाने और चलाने का सबसे तेज़ तरीका।

या यदि आपको अधिक लचीलेपन / विकल्पों की आवश्यकता है:

xsd2code VS ऐड-इन (कोडप्लेक्स)


10
मुझे मेरे लिए काम करने के लिए xsd2code नहीं मिला। xsd.exe अधिक मजबूत है, लेकिन स्कीमा के साथ संघर्ष करता है जिसमें "परिपत्र" समूह हैं।
जेफ

xsd2code दृश्य स्टूडियो 2017 में काम करता है और वास्तव में वही था जिसकी मुझे तलाश थी। आपको इसे पहले प्रोग्राम फाइल्स (x86) डायरेक्टरी में चलाना होगा, फिर vsix इंस्टॉलर का उपयोग करना होगा। तब यह बहुत अच्छा काम करता है। यह xsd.exe के लिए FAR SUPERIOUR था जिसने एरेसिए के बजाय [] [] उत्पन्न किया था, जिसमें एक विशाल .xsd था और मुझे XML को अनुक्रमित करने के लिए कक्षाएं बनाने की आवश्यकता थी। xsd.exe सीरियल-योग्य कोड उत्पन्न नहीं करेगा (.net core 2) और xsd2code ने महान काम किया
hanzolo

विजुअल स्टूडियो 2015 ई 2017 के लिए XSD2CODE का अपडेट किया गया संस्करण यहां है: marketplace.visualstudio.com/…
Gianpiero

मूल xsd2code अब xsd2code ++ है। सामुदायिक संस्करण वीएस मार्केटप्लेस
गर्ड के

17

मैं आपको यहाँ Vs2017 और Vs2019 का उपयोग करने का सबसे आसान तरीका दिखाता हूँ, अपने xsd को विज़ुअल स्टूडियो के साथ खोलें और सुझाए गए url के अनुसार एक नमूना xml फ़ाइल बनाएँ ।

  1. एक बार जब आप अपना xsd डिज़ाइन दृश्य में खोलते हैं, तो xml स्कीमा एक्सप्लोरर पर क्लिक करें यहां छवि विवरण दर्ज करें

2. "XML स्कीमा एक्सप्लोरर" के भीतर रूट / डेटा नोड को खोजने के लिए सभी तरह से नीचे स्क्रॉल करें। रूट / डेटा नोड पर राइट क्लिक करें और यह "जेनरेट सैंपल एक्सएमएल" दिखाएगा। यदि यह नहीं दिखाता है, तो इसका मतलब है कि आप डेटा तत्व नोड पर नहीं हैं, लेकिन आप डेटा परिभाषा नोड में से किसी पर हैं।

यहां छवि विवरण दर्ज करें

  1. क्लिपबोर्ड में अपने उत्पन्न Xml की प्रतिलिपि बनाएँ
  2. अपने समाधान में एक नया खाली वर्ग बनाएं और वर्ग परिभाषा को हटा दें। केवल नेमस्पेस ही रहना चाहिए
  3. जब आपका माउस पॉइंटर आपकी कक्षा के अंदर केंद्रित होता है, तो EDIT-> पेस्ट स्पेशल-> वर्गों के रूप में Xml पेस्ट करें

यह दुर्भाग्य से सभी वर्गों को उत्पन्न करने की गारंटी नहीं है, लेकिन यह एक COOL चाल है।
जॉन ज़ब्रोस्की

1
@ जॉनहोब्रोस्की आपके पास कोई मामला नहीं था कि यह आपके लिए काम नहीं करता है? यह नमूना xml पर निर्भर करता है, यदि आप सभी वर्गों और सदस्यों के साथ नमूना xml बना सकते हैं, तो किसी भी वर्ग और सदस्य को याद करने का कोई कारण नहीं है।
बटमासी

मेरी बात काम करने की गारंटी नहीं है। लेकिन यह एक COOL ट्रिक है।
जॉन ज़ब्रोस्की

अद्भुत जवाब। तुम कुछ ठंडी बियर के लायक हो !!
हेनरीगुइलेन 17

14

xsd.exe तब अच्छी तरह से काम नहीं करता है जब आपके पास परिपत्र संदर्भ होते हैं (यानी एक प्रकार सीधे या परोक्ष रूप से अपने स्वयं के एक तत्व का मालिक हो सकता है)।

जब परिपत्र संदर्भ मौजूद होते हैं, तो मैं Xsd2Code का उपयोग करता हूं। Xsd2Code परिपत्र संदर्भों को अच्छी तरह से संभालता है और वीएस आईडीई के भीतर काम करता है, जो एक बड़ा प्लस है। इसमें बहुत सारी विशेषताएं हैं जिनका उपयोग आप क्रमांकन / डीरिएलाइज़ेशन कोड उत्पन्न करने की तरह कर सकते हैं। सुनिश्चित करें कि आप GenerateXMLAttributes को चालू करते हैं यदि आप क्रमांकन उत्पन्न कर रहे हैं (अन्यथा आप सभी तत्वों पर परिभाषित नहीं होने पर ऑर्डर करने के लिए अपवाद प्राप्त करेंगे)।

न तो पसंद सुविधा के साथ काम करता है। आपके द्वारा इच्छित प्रकार के बजाय ऑब्जेक्ट की सूची / संग्रह के साथ समाप्त हो जाएगा। मैं आपके xsd में पसंद से बचने की सलाह दूंगा यदि संभव हो तो यह क्रमबद्ध रूप से अच्छी तरह से टाइप किए गए वर्ग में अच्छी तरह से अनुक्रमित / डिस्क्राइलाइज नहीं करता है। यदि आप इस बारे में परवाह नहीं करते हैं, तो यह एक समस्या नहीं है।

Xsd2code में कोई भी सुविधा System.Xml.XmlElement के रूप में डिसेरिअलाइज़ करती है, जो मुझे वास्तव में सुविधाजनक लगता है, लेकिन यदि आप मजबूत टाइप की गई वस्तुएं चाहते हैं तो यह एक समस्या हो सकती है। कस्टम कॉन्फ़िगरेशन डेटा की अनुमति देते समय मैं अक्सर किसी भी का उपयोग करता हूं, इसलिए एक एक्सएमएल क्लेमेंट किसी अन्य एक्सएमएल डिसेरलाइज़र को पारित करने के लिए सुविधाजनक है जो कहीं और कस्टम परिभाषित है।


मैंने आपका उत्तर देखकर xsd2code जोड़ा। क्या हमें परिपत्र समूह संदर्भों की देखभाल के लिए कुछ भी बदलने की आवश्यकता है? यह मेरे लिए डिफ़ॉल्ट गुणों के साथ काम नहीं कर रहा है
ज्योत्सना सोनवणे

मुझे परिपत्र संदर्भों के साथ काम करने के लिए कुछ विशेष नहीं करना पड़ा। यदि आप xml को एक नए प्रश्न के रूप में पोस्ट करते हैं और यहां एक लिंक जोड़ते हैं तो मुझे इस पर एक नज़र डालने में खुशी होती है।
वोट कॉफ़ी

10

एक त्वरित और आलसी समाधान के लिए , (और वीएस का उपयोग बिल्कुल नहीं) इन ऑनलाइन कन्वर्टर्स का प्रयास करें:

XSD => XML => C # कक्षाएं

उदाहरण 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>

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>

जो इस वर्ग संरचना में परिवर्तित होता है:

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

}

ध्यान! ध्यान रखें कि यह सिर्फ गेट-यू-स्टार्ट के लिए है, परिणाम स्पष्ट रूप से परिशोधन की आवश्यकता है!


बहुत बहुत धन्यवाद। यह उन लोगों के लिए एक अच्छा उदाहरण के रूप में उपयोग किया जा सकता है जो XML स्कीमा और XML को .NET में सीख रहे हैं
theeranitp

अद्भुत जवाब। आप कुछ ठंडे बियर के लायक हैं!
हेनरीगुइलेन 17

5

मैं सीधे और से फाइल और कक्षाएं XSDउत्पन्न करने के लिए एक बैच स्क्रिप्ट का उपयोग करता हूं : .xsdXML

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%

2

मेरे मामले में काम करने वाली कमान थी:

xsd /c your.xsd 

1

मार्क ग्रेवेल्स का उत्तर मेरे लिए सही था लेकिन मेरा xsd .xml के विस्तार के साथ था। जब मैंने xsd प्रोग्राम का उपयोग किया तो यह दिया:
- The table (Amt) cannot be the child table to itself in nested relations.

इस KB325695 के अनुसार मैंने .xml से .xsd तक एक्सटेंशन का नाम बदल दिया और यह ठीक काम कर गया।


1

मैंने xsd.exeविंडोज कमांड प्रॉम्प्ट में इस्तेमाल किया ।

हालाँकि, जब से मेरे xml ने कई ऑनलाइन xml का संदर्भ लिया (मेरे मामले में http://www.w3.org/1999/xlink.xsdजो संदर्भ देता है http://www.w3.org/2001/xml.xsd) मुझे भी उन स्कीमैटिक को डाउनलोड करना था, उन्हें मेरी xsd जैसी ही डायरेक्टरी में डाल दिया, और फिर उन फाइलों को कमांड में सूचीबद्ध किया:

"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 उपकरण \ xsd.exe" / कक्षाएं / भाषा: CS your.xsd xlink.xsd xml.xsd


यह अमेज़ॅन मार्केट प्लेस एक्सएसडी का नहीं होगा जहां आप अभी के लिए कक्षाएं बना रहे हैं, :-) मुझे उनके साथ एक बार काम करना होगा, फिर कभी मैं उन्हें नहीं छूऊंगा या सी # एमज़ोन एक्सएसडी फ़ाइलों का उपयोग करके कोई काम नहीं कर सकता, इस तरह की गड़बड़ यह असत्य है।
shawty

@ शाश्वत I जीआईएस मानकों के साथ काम कर रहा था - डब्ल्यूएफएस और डब्ल्यूएमएस - जो बड़े, परिपत्र क्रॉस-संदर्भित एक्सएसडी द्वारा परिभाषित किए गए हैं। के साथ एक बड़ा गड़बड़ था xsd.exeक्योंकि यह परिपत्र संदर्भ पसंद नहीं करता है, लेकिन मैं अंत में सफल रहा।
अस्के बी।

हाँ, यह मेरा दूसरा अनुमान होता। देखा उन भी, उनकी कोई जिसके पास में बुरा के रूप में के रूप में Amazons सामान हालांकि ... देता है मुझे याद बुरे सपने shudders
shawty

0

WSDL के साथ, मेरे पास xsd फाइलें थीं। ऊपर वाले ने मेरे मामले में काम नहीं किया। इसने इस प्रकार काम किया

wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl 
D:\CXTypes.xsd D:\CTypes.xsd 
D:\Preferences.xsd 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.