J'utilise xsd.exe pour générer des classes C# à partir d'un fichier .xsd. J'ai rencontré le même problème qui est couvert ici et sur d'autres sites où xsd.exe génère des tableaux Type [] à la place des collections de listes génériques pour les types dans le fichier .xsd. Certaines personnes ont suggéré que svcutil.exe peut être utilisé en remplacement de xsd.exe si vous transmettez le paramètre/dataContractOnly à svcutil.exe. Cependant, il semble que ces personnes se trompent car svcutil.exe génère réellement les propriétés du tableau System.Xml.XmlNode [] au lieu de créer des types basés sur le schéma du fichier .xsd.svcutil.exe est-il un remplacement de xsd.exe?
Par exemple, étant donné ce simple schéma 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/classes Example.xsd' génère:
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/sérialiseur: XmlSerializer/importXmlTypes /collectionType:System.Collections.Generic.List`1 Example.xsd » génère:
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;
}
}
Est-ce que svcutil.exe est vraiment censé être un remplacement de xsd.exe? La sortie générée semble être très différente. À ce stade, il semble que je devrais utiliser xsd.exe pour créer des classes à partir de mon fichier .xsd, puis modifier manuellement le code pour l'obtenir dans la forme que je veux. Je me rends compte que l'utilisation de code purement généré serait idéal, mais je me demandais si d'autres personnes utilisaient xsd.exe comme point de départ et travaillaient à partir de là ou si j'avais besoin d'envisager une autre approche?
Existe-t-il des mises à jour de xsd.exe dans Visual Studio 2010?
svcutil n'était pas destiné à remplacer xsd.exe. Pour vous rapprocher le plus possible, essayez d'utiliser les options '/ dataContractOnly' et '/ serializer: XmlSerializer'. –
ServiceUtil est confus par l'option 'xs: all'. Si votre XSD utilisait 'xs: sequence' svcUtil générerait la sortie appropriée. À partir des documents sur le sérialiseur datacontract et svcUtil: xs: all - Interdit. http://msdn.microsoft.com/en-us/library/ms733112(v=vs.110).aspx – jessehouwing
Vous pouvez trouver ma réponse à la même question [ici] [1] [1 ]: http://stackoverflow.com/a/24557248/1125467 – vivekp