Ich verwende xsd.exe, um einige C# -Klassen aus einer .xsd-Datei zu generieren. Ich stieß auf das gleiche Problem, das hier und auf anderen Websites behandelt wird, wo xsd.exe Typ [] -Arrays statt generische Auflistung Auflistungen für Typen in der XSD-Datei generiert. Einige Leute haben vorgeschlagen, dass svcutil.exe als Ersatz für xsd.exe verwendet werden kann, wenn Sie den Parameter/dataContractOnly an svcutil.exe übergeben. Es scheint jedoch so, als ob diese Personen falsch sind, da svcutil.exe tatsächlich System.Xml.XmlNode [] -Arrayeigenschaften generiert, anstatt Typen basierend auf dem Schema in der XSD-Datei zu erstellen.Ist svcutil.exe ein Ersatz für xsd.exe?
Zum Beispiel angesichts dieser einfachen 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/Klassen Example.xsd' erzeugt:
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‘erzeugt:
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;
}
}
Ist svcutil.exe wirklich ein Ersatz für xsd.exe? Die erzeugte Ausgabe scheint ganz anders zu sein.
An dieser Stelle sieht es so aus, als müsste ich xsd.exe verwenden, um Klassen aus meiner .xsd-Datei zu erstellen, und dann den Code manuell anpassen, um ihn in der von mir gewünschten Form zu erhalten. Ich weiß, dass die Verwendung von rein generiertem Code ideal wäre, aber ich frage mich, ob andere Leute xsd.exe als Ausgangspunkt verwenden und dann von dort aus arbeiten oder ob ich einen anderen Ansatz insgesamt in Betracht ziehen muss?
Gibt es Updates für xsd.exe in Visual Studio 2010?
svcutil war nicht als Ersatz für xsd.exe gedacht. Um so nahe wie möglich zu kommen, versuchen Sie es mit den Schaltern '/ dataContractOnly' und '/ serializer: XmlSerializer'. –
ServiceUtil wird durch die Option "xs: all" verwirrt. Wenn Ihr XSD 'xs: sequence 'verwenden würde, würde svcUtil die korrekte Ausgabe erzeugen. Aus den Docs auf dem DataContract-Serializer und SVCUtil: xs: all - Forbidden. http://msdn.microsoft.com/en-us/library/ms733112(v=vs.110).aspx – jessehouwing
Sie können meine Antwort auf die gleiche Frage [hier] [1] [1 finden ]: http://stackoverflow.com/a/24557248/1125467 – vivekp