Visual Studio 2010 kullanarak bir xsd dosyasından .NET 4.0 c # sınıfları (varlıkları) oluşturma seçenekleri nelerdir?
Visual Studio 2010 kullanarak bir xsd dosyasından .NET 4.0 c # sınıfları (varlıkları) oluşturma seçenekleri nelerdir?
Yanıtlar:
yeterince basit; sadece çalıştır (vs komut isteminde)
xsd your.xsd /classes
(oluşturacak your.cs
). Bununla birlikte, buradaki gerçek seçeneklerin çoğunun 2.0'dan beri çok fazla değişmediğini unutmayın.
Seçenekler için MSDN'yi kullanın xsd /?
veya bakın ; örneğin /enableDataBinding
yararlı olabilir.
xsd schema1.xsd schema2.xsd schema3.xsd /c
Marc Gravell tarafından belirtildiği gibi xsd.exe. IMO'yu kurmanın ve çalıştırmanın en hızlı yolu.
Veya daha fazla esnekliğe / seçeneğe ihtiyacınız varsa:
xsd2code VS eklentisi (Codeplex)
Burada size Vs2017 ve Vs2019 kullanarak en kolay yolu göstermek xsd Visual Studio ile açın ve önerilen url örnek bir xml dosyası oluşturmak .
2. “XML Şema Gezgini” içinde kök / veri düğümünü bulmak için aşağı kaydırın. Kök / veri düğümüne sağ tıklayın ve “Örnek XML Oluştur” görünecektir. Gösterilmezse, veri öğesi düğümünde değilsiniz, ancak herhangi bir veri tanımı düğümünde olduğunuz anlamına gelir.
Dairesel referanslarınız olduğunda xsd.exe iyi çalışmaz (örn. bir tür doğrudan veya dolaylı olarak kendi türünde bir öğeye sahip olabilir).
Dairesel başvurular olduğunda Xsd2Code kullanıyorum. Xsd2Code, dairesel referansları iyi işler ve büyük bir artı olan VS IDE içinde çalışır. Ayrıca, serileştirme / serileştirme kodunu oluşturmak gibi kullanabileceğiniz birçok özelliğe sahiptir. Yine de serileştirme oluşturuyorsanız GenerateXMLAttributes'ı açtığınızdan emin olun (aksi takdirde tüm öğelerde tanımlanmadıysa sipariş için istisnalar alırsınız).
Her ikisi de seçim özelliği ile iyi çalışmıyor. istediğiniz türün yerine liste / nesne koleksiyonuyla karşılaşırsınız. Eğer güçlü bir şekilde yazılmış bir sınıfa iyi serileştirmek / serisini kaldırmak değil gibi mümkünse xsd seçim kaçınarak tavsiye ederim. Bununla ilgilenmiyorsan, o zaman sorun değil.
Xsd2code içindeki herhangi bir özellik System.Xml.XmlElement olarak serileştirir. Özel yapılandırma verilerine izin verirken genellikle herhangi birini kullanırım, bu nedenle bir XmlElement, başka bir yerde özel olarak tanımlanan başka bir XML deserializer'a geçmek için uygundur.
Bir İçin Hızlı ve tembel çözümü , (ve hiç VS kullanarak değil) bu çevrimiçi dönüştürücüleri deneyin:
XSD => XML => C # sınıfları
Örnek 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'ye dönüştürür:
<?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>
Bu sınıf yapısına dönüşen:
/*
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; }
}
}
Dikkat! Bunun sadece Başlarken için olduğunu göz önünde bulundurun, sonuçların açıkça iyileştirmelere ihtiyacı var!
Kullandığım XSD
üretmek için bir toplu komut dosyasında .xsd
dosya ve sınıfları XML
doğrudan:
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%
Marc Gravells yanıtı benim için doğru ama benim xsd .xml uzantısı ile oldu. Ben xsd programı kullandığımda verdi:
- The table (Amt) cannot be the child table to itself in nested relations.
Bu KB325695 göre uzantısı .xml .xsd için yeniden adlandırdı ve iyi çalıştı.
Kullandığım xsd.exe
istemi, Windows komut.
Ancak, benim xml birkaç çevrimiçi xml (bu durumda http://www.w3.org/1999/xlink.xsd
hangi referanslar http://www.w3.org/2001/xml.xsd
) referans beri bu şemaları indirmek, benim xsd ile aynı dizine koymak ve komutta bu dosyaları listelemek zorunda kaldı:
"C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Araçlar \ xsd.exe" / sınıflar / dil: CS your.xsd xlink.xsd xml.xsd
xsd.exe
Dairesel referansları sevmediği için büyük bir karmaşa vardı , ama sonunda başarılıydım.
WSDL ile birlikte xsd dosyalarım vardı. Yukarıdaki benim durumumda işe yaramadı hata verdi. Aşağıdaki gibi çalıştı
wsdl /l:C# /out:D:\FileName.cs D:\NameApi\wsdl_1_1\RESAdapterService.wsdl
D:\CXTypes.xsd D:\CTypes.xsd
D:\Preferences.xsd