ตัวเลือกในการสร้าง. NET 4.0 c # คลาส (เอนทิตี) จากไฟล์ xsd โดยใช้ Visual Studio 2010 มีอะไรบ้าง
ตัวเลือกในการสร้าง. NET 4.0 c # คลาส (เอนทิตี) จากไฟล์ xsd โดยใช้ Visual Studio 2010 มีอะไรบ้าง
คำตอบ:
ง่ายพอ เพิ่งรัน (ที่พร้อมรับคำสั่ง vs)
xsd your.xsd /classes
(ซึ่งจะสร้างyour.cs
) อย่างไรก็ตามโปรดทราบว่าตัวเลือกที่แท้จริงที่นี่ส่วนใหญ่ไม่ได้เปลี่ยนแปลงมากนักตั้งแต่ 2.0
สำหรับตัวเลือกใช้xsd /?
หรือดู MSDN ; ตัวอย่างเช่น/enableDataBinding
มีประโยชน์
xsd schema1.xsd schema2.xsd schema3.xsd /c
xsd.exe ตามที่ระบุไว้โดย Marc Gravell วิธีที่เร็วที่สุดในการเริ่มต้นและเรียกใช้ IMO
หรือถ้าคุณต้องการความยืดหยุ่น / ตัวเลือกเพิ่มเติม:
xsd2code VS add-in (Codeplex)
ผมแสดงให้คุณวิธีที่ง่ายที่สุดที่นี่โดยใช้ Vs2017 และ Vs2019 เปิด xsd ของคุณกับ Visual Studio และสร้างไฟล์ XML ตัวอย่างเช่นเดียวกับในurl ของปัญหา
2. ภายใน“ XML Schema Explorer” เลื่อนลงจนสุดเพื่อค้นหาโหนดรูท / ดาต้า คลิกขวาที่โหนดรูท / ดาต้าและมันจะแสดง“ สร้างตัวอย่าง XML” หากไม่แสดงนั่นหมายความว่าคุณไม่ได้อยู่ในโหนดองค์ประกอบข้อมูล แต่คุณอยู่ในโหนดนิยามข้อมูลใด ๆ
xsd.exe ทำงานได้ไม่ดีเมื่อคุณมีการอ้างอิงแบบวงกลม (เช่นชนิดสามารถเป็นเจ้าขององค์ประกอบของชนิดของตัวเองโดยตรงหรือโดยอ้อม)
เมื่อมีการอ้างอิงแบบวงกลมฉันใช้ Xsd2Code Xsd2Code จัดการการอ้างอิงแบบวงกลมได้ดีและทำงานภายใน VS IDE ซึ่งเป็นข้อดีอย่างมาก นอกจากนี้ยังมีคุณสมบัติมากมายที่คุณสามารถใช้เช่นสร้างรหัสซีเรียลไลเซชั่น / ดีซีเรียลไลเซชัน ตรวจสอบให้แน่ใจว่าคุณเปิด GenerateXMLAttributes หากคุณกำลังสร้างซีเรียลไลซ์เซชั่น (มิฉะนั้นคุณจะได้รับข้อยกเว้นสำหรับการสั่งซื้อหากไม่ได้กำหนดไว้ในองค์ประกอบทั้งหมด)
ไม่สามารถใช้งานได้ดีกับคุณสมบัติตัวเลือก คุณจะจบลงด้วยรายการ / กลุ่มวัตถุแทนประเภทที่คุณต้องการ ฉันขอแนะนำให้หลีกเลี่ยงตัวเลือกใน xsd ของคุณถ้าเป็นไปได้เพราะสิ่งนี้ไม่ได้เป็นอนุกรม / ดีซีเรียลไลซ์เป็นคลาสที่พิมพ์ออกมาอย่างดี ถ้าคุณไม่สนใจเรื่องนี้ก็ไม่เป็นปัญหา
ฟีเจอร์ใด ๆ ใน xsd2code deserializes เป็น System.Xml.XmlElement ซึ่งฉันพบว่าสะดวกมาก แต่อาจเป็นปัญหาถ้าคุณต้องการวัตถุที่พิมพ์ได้ดี ฉันมักจะใช้สิ่งใด ๆ เมื่ออนุญาตให้ข้อมูลการกำหนดค่าแบบกำหนดเองดังนั้น XmlElement จึงสะดวกต่อการส่งผ่านไปยังตัว deserializer XML อื่นที่กำหนดเองที่อื่น
สำหรับวิธีแก้ปัญหาที่รวดเร็วและขี้เกียจ (และไม่ใช้ 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; }
}
}
ความสนใจ! พิจารณาว่านี่เป็นเพียงการเริ่มต้นใช้งานผลลัพธ์ที่ได้นั้นต้องได้รับการปรับแต่ง!
ฉันใช้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%
คำสั่งที่ทำงานในกรณีของฉันคือ:
xsd /c your.xsd
คำตอบของ Marc Gravells นั้นเหมาะสำหรับฉัน แต่ xsd ของฉันพร้อมส่วนขยาย. xml เมื่อฉันใช้โปรแกรม xsd มันให้:
- The table (Amt) cannot be the child table to itself in nested relations.
ตามKB325695นี้ฉันเปลี่ยนชื่อส่วนขยายจาก. xml เป็น. xsd และทำงานได้ดี
ฉันใช้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
xsd.exe
เพราะไม่ชอบการอ้างอิงแบบวงกลม แต่ฉันก็ประสบความสำเร็จในที่สุด
พร้อมกับ 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