Estoy usando xsd.exe para generar algunas clases C# de un archivo .xsd. Me encontré con el mismo problema que se trata aquí y en otros sitios donde xsd.exe genera matrices tipo [] en lugar de colecciones de listas genéricas para tipos en el archivo .xsd. Algunas personas han sugerido que svcutil.exe se puede usar como reemplazo de xsd.exe si pasa el parámetro/dataContractOnly a svcutil.exe. Sin embargo, parece que esas personas están equivocadas porque svcutil.exe realmente genera las propiedades de matriz System.Xml.XmlNode [] en lugar de crear tipos basados en el esquema en el archivo .xsd.¿Es svcutil.exe un reemplazo para xsd.exe?
Por ejemplo, dado este esquema simple .xsd:
<?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/clases Example.xsd' genera:
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: Código/dataContractOnly/serializador: XmlSerializer/importXmlTypes /collectionType:System.Collections.Generic.List`1 Example.xsd' genera:
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;
}
}
¿Realmente se supone que svcutil.exe es un reemplazo para xsd.exe? La salida generada parece ser bastante diferente.
En este punto, parece que tendré que usar xsd.exe para crear clases desde mi archivo .xsd y luego modificar manualmente el código para obtenerlo en la forma que quiero. Me doy cuenta de que usar código puramente generado sería ideal, pero me preguntaba si otras personas están usando xsd.exe como punto de partida y luego trabajando desde allí o si necesito considerar otro enfoque por completo.
¿Hay alguna actualización de xsd.exe en Visual Studio 2010?
svcutil no fue pensado como un reemplazo para xsd.exe. Para acercarse lo más posible, intente utilizar los conmutadores '/ dataContractOnly' y '/ serializer: XmlSerializer'. –
ServiceUtil se confunde con la opción 'xs: all'. Si su XSD fuera a usar 'xs: sequence', svcUtil generaría la salida adecuada. De los documentos del serializador de contrato de datos y svcUtil: xs: all - Forbidden. http://msdn.microsoft.com/en-us/library/ms733112(v=vs.110).aspx – jessehouwing
Puede encontrar mi respuesta a la misma pregunta [aquí] [1] [1 ]: http://stackoverflow.com/a/24557248/1125467 – vivekp