วิธีสร้างคลาส. NET 4.0 จาก xsd


317

ตัวเลือกในการสร้าง. NET 4.0 c # คลาส (เอนทิตี) จากไฟล์ xsd โดยใช้ Visual Studio 2010 มีอะไรบ้าง


@drzaus ฉันมีงานนี้ในอดีต แต่ตอนนี้เมื่อฉันเพิ่มมันสร้างเป็นคลาสชุดข้อมูลแทนการเรียนที่ฉันคาดหวัง ฉันเพิ่งเพิ่มรายการที่มีอยู่และเลือกไฟล์ XSD
msmucker0527

คำตอบ:


490

ง่ายพอ เพิ่งรัน (ที่พร้อมรับคำสั่ง vs)

xsd your.xsd /classes

(ซึ่งจะสร้างyour.cs) อย่างไรก็ตามโปรดทราบว่าตัวเลือกที่แท้จริงที่นี่ส่วนใหญ่ไม่ได้เปลี่ยนแปลงมากนักตั้งแต่ 2.0

สำหรับตัวเลือกใช้xsd /?หรือดู MSDN ; ตัวอย่างเช่น/enableDataBindingมีประโยชน์


83
"ไฟล์ C: \ Program (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / คลาส / ภาษา: CS your.xsd
GeorgesC

2
Gravell เพื่อช่วยเหลืออีกครั้ง! แม้ว่าคำตอบนี้ถูกต้อง 100% ในกรณีของฉันฉันพบว่าง่ายที่สุดในการเพิ่มเส้นทางไดเรกทอรี xsd.exe ไปยังตัวแปรสภาพแวดล้อมของเส้นทาง คอมพิวเตอร์ของฉัน -> คุณสมบัติ -> ขั้นสูง -> ตัวแปรสภาพแวดล้อม -> เส้นทาง - และเพิ่ม "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \" (แน่นอน ใส่ใจกับทั้ง windows และ. NET รุ่นเฉพาะกับเครื่องของคุณ) - การเข้ารหัสที่มีความสุข!
pimbrouwers

15
สำหรับกรณีที่คุณมีคำจำกัดความของสคีมาเชื่อมโยงกันหลายชื่อเพียงแค่ตั้งชื่อพวกเขาทั้งหมด xsd schema1.xsd schema2.xsd schema3.xsd /c
mivra

56

xsd.exe ตามที่ระบุไว้โดย Marc Gravell วิธีที่เร็วที่สุดในการเริ่มต้นและเรียกใช้ IMO

หรือถ้าคุณต้องการความยืดหยุ่น / ตัวเลือกเพิ่มเติม:

xsd2code VS add-in (Codeplex)


10
ฉันไม่สามารถรับ xsd2code ให้ฉันได้เลย xsd.exe มีประสิทธิภาพมากขึ้น แต่การต่อสู้กับ schemas ที่มีกลุ่ม "วงกลม"
Jeff

xsd2code ทำงานใน visual studio 2017 และเป็นสิ่งที่ฉันกำลังมองหา คุณต้องเรียกใช้ก่อนในไดเรกทอรีไฟล์โปรแกรม (x86) จากนั้นใช้โปรแกรมติดตั้ง vsix จากนั้นก็ใช้งานได้ดี มันยอดเยี่ยมกับ xsd.exe ซึ่งสร้างอาร์เรย์ [] [] แทน lists.i ฉันมี. xsd ยักษ์และฉันจำเป็นต้องสร้างคลาสเพื่อทำให้ XML เป็นอนุกรม xsd.exe จะไม่สร้างรหัสที่สามารถทำให้เป็นอนุกรม (.net core 2) และ xsd2code ทำงานได้ดี
hanzolo

รุ่นปรับปรุงของ XSD2CODE สำหรับ Visual Studio 2015 E 2017 อยู่ที่นี่: marketplace.visualstudio.com/...
Gianpiero

xsd2code ดั้งเดิมตอนนี้ xsd2code ++ รุ่นชุมชนพร้อมใช้งานใน VS Marketplace
Gerd K

17

ผมแสดงให้คุณวิธีที่ง่ายที่สุดที่นี่โดยใช้ Vs2017 และ Vs2019 เปิด xsd ของคุณกับ Visual Studio และสร้างไฟล์ XML ตัวอย่างเช่นเดียวกับในurl ของปัญหา

  1. เมื่อคุณเปิด xsd ในมุมมองออกแบบด้านล่างให้คลิกที่ xml schema explorer ป้อนคำอธิบายรูปภาพที่นี่

2. ภายใน“ XML Schema Explorer” เลื่อนลงจนสุดเพื่อค้นหาโหนดรูท / ดาต้า คลิกขวาที่โหนดรูท / ดาต้าและมันจะแสดง“ สร้างตัวอย่าง XML” หากไม่แสดงนั่นหมายความว่าคุณไม่ได้อยู่ในโหนดองค์ประกอบข้อมูล แต่คุณอยู่ในโหนดนิยามข้อมูลใด ๆ

ป้อนคำอธิบายรูปภาพที่นี่

  1. คัดลอก Xml ที่คุณสร้างขึ้นไปที่คลิปบอร์ด
  2. สร้างคลาสว่างใหม่ในโซลูชันของคุณและลบคำจำกัดความของคลาส เนมสเปซเท่านั้นที่ควรอยู่
  3. ในขณะที่ตัวชี้เมาส์เน้นไปที่คลาสของคุณเลือก EDIT-> Paste Special-> Paste Xml เป็น Classes

สิ่งนี้ไม่ได้รับประกันว่าจะสร้างคลาสทั้งหมดโชคไม่ดี แต่เป็นเคล็ดลับ COOL
John Zabroski

1
@JohnZabroski คุณมีกรณีใดที่ไม่ได้ผลสำหรับคุณหรือไม่ มันขึ้นอยู่กับตัวอย่าง xml หากคุณสามารถสร้างตัวอย่าง xml กับคลาสและสมาชิกทั้งหมดไม่มีเหตุผลที่จะพลาดคลาสและสมาชิกใด ๆ
batmaci

จุดของฉันคือขั้นตอนที่ 2 ไม่รับประกันว่าจะทำงาน แต่มันเป็นเคล็ดลับเย็น
John Zabroski

คำตอบที่ยอดเยี่ยม คุณสมควรได้รับเบียร์เย็น ๆ !!
HenryGuillen17

14

xsd.exe ทำงานได้ไม่ดีเมื่อคุณมีการอ้างอิงแบบวงกลม (เช่นชนิดสามารถเป็นเจ้าขององค์ประกอบของชนิดของตัวเองโดยตรงหรือโดยอ้อม)

เมื่อมีการอ้างอิงแบบวงกลมฉันใช้ Xsd2Code Xsd2Code จัดการการอ้างอิงแบบวงกลมได้ดีและทำงานภายใน VS IDE ซึ่งเป็นข้อดีอย่างมาก นอกจากนี้ยังมีคุณสมบัติมากมายที่คุณสามารถใช้เช่นสร้างรหัสซีเรียลไลเซชั่น / ดีซีเรียลไลเซชัน ตรวจสอบให้แน่ใจว่าคุณเปิด GenerateXMLAttributes หากคุณกำลังสร้างซีเรียลไลซ์เซชั่น (มิฉะนั้นคุณจะได้รับข้อยกเว้นสำหรับการสั่งซื้อหากไม่ได้กำหนดไว้ในองค์ประกอบทั้งหมด)

ไม่สามารถใช้งานได้ดีกับคุณสมบัติตัวเลือก คุณจะจบลงด้วยรายการ / กลุ่มวัตถุแทนประเภทที่คุณต้องการ ฉันขอแนะนำให้หลีกเลี่ยงตัวเลือกใน xsd ของคุณถ้าเป็นไปได้เพราะสิ่งนี้ไม่ได้เป็นอนุกรม / ดีซีเรียลไลซ์เป็นคลาสที่พิมพ์ออกมาอย่างดี ถ้าคุณไม่สนใจเรื่องนี้ก็ไม่เป็นปัญหา

ฟีเจอร์ใด ๆ ใน xsd2code deserializes เป็น System.Xml.XmlElement ซึ่งฉันพบว่าสะดวกมาก แต่อาจเป็นปัญหาถ้าคุณต้องการวัตถุที่พิมพ์ได้ดี ฉันมักจะใช้สิ่งใด ๆ เมื่ออนุญาตให้ข้อมูลการกำหนดค่าแบบกำหนดเองดังนั้น XmlElement จึงสะดวกต่อการส่งผ่านไปยังตัว deserializer XML อื่นที่กำหนดเองที่อื่น


ฉันเพิ่ม xsd2code โดยดูคำตอบของคุณ เราจำเป็นต้องเปลี่ยนแปลงอะไรหรือเปล่าเพื่อดูแลการอ้างอิงกลุ่มแบบวงกลม? มันไม่ทำงานสำหรับฉันที่มีคุณสมบัติเริ่มต้น
Jyotsna Sonawane

ฉันไม่ต้องทำอะไรเป็นพิเศษเพื่อให้ทำงานกับการอ้างอิงแบบวงกลม หากคุณโพสต์ xml เป็นคำถามใหม่และเพิ่มลิงค์ที่นี่ฉันยินดีที่จะดู
VoteCoffee

10

สำหรับวิธีแก้ปัญหาที่รวดเร็วและขี้เกียจ (และไม่ใช้ VS เลย) ลองใช้ตัวแปลงออนไลน์เหล่านี้:

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 Schema และ XML ใน. NET
theeranitp

คำตอบที่ยอดเยี่ยม คุณสมควรได้รับเบียร์เย็น ๆ !
HenryGuillen17

5

ฉันใช้XSDสคริปต์ชุดงานเพื่อสร้าง.xsdไฟล์และคลาสจากXMLโดยตรง:

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%


1

คำตอบของ Marc Gravells นั้นเหมาะสำหรับฉัน แต่ xsd ของฉันพร้อมส่วนขยาย. xml เมื่อฉันใช้โปรแกรม xsd มันให้:
- The table (Amt) cannot be the child table to itself in nested relations.

ตามKB325695นี้ฉันเปลี่ยนชื่อส่วนขยายจาก. xml เป็น. xsd และทำงานได้ดี


1

ฉันใช้xsd.exeในพรอมต์คำสั่งของ Windows

อย่างไรก็ตามเนื่องจาก xml ของฉันอ้างอิง xml ออนไลน์หลายแห่ง (ในกรณีของฉันhttp://www.w3.org/1999/xlink.xsdที่อ้างอิงhttp://www.w3.org/2001/xml.xsd) ฉันต้องดาวน์โหลด schematics เหล่านั้นด้วยดังนั้นจึงวางไว้ในไดเรกทอรีเดียวกันกับ xsd ของฉันแล้วจึงแสดงรายการไฟล์เหล่านั้นในคำสั่ง:

"C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ xsd.exe" / คลาส / ภาษา: CS your.xsd xlink.xsd xml.xsd


ที่จะไม่เกิดขึ้นเป็นตลาด Amazon XSD ของคุณที่อาคารเรียนตอนนี้มันจะ :-) ฉันต้องทำงานกับพวกเขาอีกครั้งฉันจะไม่สัมผัสพวกเขาอีกครั้งหรือทำงานใน C # โดยใช้ไฟล์ amazons XSD มี เป็นระเบียบมันไม่จริง
shawty

@shawty ฉันทำงานกับมาตรฐาน GIS - WFS และ WMS - ซึ่งกำหนดโดย XSD อ้างอิงไขว้ขนาดใหญ่ เป็นระเบียบใหญ่xsd.exeเพราะไม่ชอบการอ้างอิงแบบวงกลม แต่ฉันก็ประสบความสำเร็จในที่สุด
Aske B.

ใช่แล้วนั่นคงจะเป็นการคาดเดาครั้งที่สองของฉัน การกระทำเหล่านั้นมากเกินไปของพวกเขาไม่มีที่อยู่ใกล้ไม่ดีเท่าที่แอมะซอนสิ่ง แต่ ... ให้ฉันฝันร้ายจดจำสั่น
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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.