I am using xsd.exe to generate some c# classes from a .xsd file. I ran into the same issue that is covered here and on other sites where xsd.exe generates Type[] arrays instead of generic List collections for types in the .xsd file. Some people have suggested that svcutil.exe can be used as a replacement for xsd.exe if you pass the /dataContractOnly parameter to svcutil.exe. However, it seems like those people are mistaken because svcutil.exe actually generates System.Xml.XmlNode[] array properties instead of creating types based on the schema in the .xsd file.
For example, given this simple .xsd schema:
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:complexType name="Employee"> <xs:all> <xs:element name="FirstName" type="xs:string"></xs:element> <xs:element name="LastName" type="xs:string"></xs:element> </xs:all> </xs:complexType> <xs:element name="Employees"> <xs:complexType> <xs:sequence maxOccurs="unbounded"> <xs:element name="Employee" type="Employee"></xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
'xsd.exe /classes Example.xsd' generates:
public partial class Employees { private Employee[] employeeField; public Employee[] Employee { get { return this.employeeField; } set { this.employeeField = value; } } } public partial class Employee { private string firstNameField; private string lastNameField; public string FirstName { get { return this.firstNameField; } set { this.firstNameField = value; } } public string LastName { get { return this.lastNameField; } set { this.lastNameField = value; } } }
'svcutil.exe /target:code /dataContractOnly /serializer:XmlSerializer /importXmlTypes /collectionType:System.Collections.Generic.List`1 Example.xsd' generates:
public partial class Employee : object, System.Runtime.Serialization.IExtensibleDataObject{ private System.Runtime.Serialization.ExtensionDataObject extensionDataField; private string FirstNameField; private string LastNameField; public System.Runtime.Serialization.ExtensionDataObject ExtensionData{ get{ return this.extensionDataField; } set{ this.extensionDataField = value; } } public string FirstName{ get{ return this.FirstNameField; } set{ this.FirstNameField = value; } } public string LastName{ get{ return this.LastNameField; } set{ this.LastNameField = value; } } } public partial class Employees : object, System.Xml.Serialization.IXmlSerializable{ private System.Xml.XmlNode[] nodesField; private static System.Xml.XmlQualifiedName typeName = new System.Xml.XmlQualifiedName("Employees", "http://tempuri.org/XMLSchema.xsd"); public System.Xml.XmlNode[] Nodes{ get{ return this.nodesField; } set{ this.nodesField = value; } } public void ReadXml(System.Xml.XmlReader reader){ this.nodesField = System.Runtime.Serialization.XmlSerializableServices.ReadNodes(reader); } public void WriteXml(System.Xml.XmlWriter writer){ System.Runtime.Serialization.XmlSerializableServices.WriteNodes(writer, this.Nodes); } public System.Xml.Schema.XmlSchema GetSchema(){ return null; } public static System.Xml.XmlQualifiedName ExportSchema(System.Xml.Schema.XmlSchemaSet schemas){ System.Runtime.Serialization.XmlSerializableServices.AddDefaultSchema(schemas, typeName); return typeName; } }
Is svcutil.exe really supposed to be a replacement for xsd.exe? The output generated seems to be quite different.
At this point, it looks like I will have to use xsd.exe to create classes from my .xsd file and then manually tweak the the code to get it in the form I want. I realize that using purely generated code would be ideal, but I was wondering if other people are using xsd.exe as a starting point and then working from there or if I need to consider another approach altogether?
Are there any updates to xsd.exe in Visual Studio 2010?
Yes, svcutil.exe
can be used as a replacement for xsd.exe
but it sounds like you are having trouble getting generic collections to be generated. svcutil.exe
has a collectionType
switch that allows you to specify the type to be used for a collection:
svcutil /o:Svc.cs /ct:System.Collections.Generic.List`1 http://example.com
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With