Ist svcutil.exe ein Ersatz für xsd.exe?
Ich bin mit xsd.exe erzeugen Sie c# - Klassen aus .xsd-Datei. Ich lief in das gleiche Problem wird hier besprochen und auf anderen Seiten, wo xsd.exe generiert-Typ [] - arrays statt der generischen List-Sammlungen für die Typen in der .xsd-Datei. Einige Leute haben vorgeschlagen, dass svcutil.exe kann als Ersatz verwendet werden für xsd.exe wenn Sie übergeben die /dataContractOnly parameter svcutil.exe. Es scheint jedoch, wie die Menschen sind Irre, weil svcutil.exe tatsächlich erzeugt System.Xml.XmlNode [] " array-Eigenschaften erstellen, anstatt Typen, basierend auf dem schema in der .xsd-Datei.
Betrachten Sie beispielsweise diese einfache .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 Beispiel.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.Sammlungen.Generisches.List`1.Beispiel.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 eigentlich sollte ein Ersatz für xsd.exe? Die erzeugte Ausgabe scheint zu sein, ganz anders.
- Zu diesem Zeitpunkt sieht es aus wie ich haben xsd.exe erstellen von Klassen aus meiner .xsd-Datei und dann manuell zu optimieren, die den code, um es in die form, die ich will. Ich merke, dass das rein erzeugte code wäre ideal, aber ich Frage mich, wenn andere Personen xsd.exe als Ausgangspunkt und dann arbeiten von dort oder wenn ich brauche zu betrachten, einen anderen Ansatz insgesamt?
- Gibt es irgendwelche updates zu xsd.exe in Visual Studio 2010?
InformationsquelleAutor der Frage jameswelle | 2009-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja,
svcutil.exe
kann als Ersatz verwendet werden fürxsd.exe
aber es klingt wie Sie Schwierigkeiten generische Sammlungen generiert werden.svcutil.exe
hat einecollectionType
- Schalter können Sie den Typ angeben, werden verwendet für eine Sammlung:InformationsquelleAutor der Antwort Andrew Hare
Klärung
Andrew Hare ' s Antwort oben funktioniert, aber die Beispiel-Befehl, der jameswelle eingefügt über seine letzten Abschnitt des Codes:
svcutil.exe /target:code /dataContractOnly /serializer:XmlSerializer /importXmlTypes /collectionType:System.Collections.Generic.List`1 Example.xsd
nicht Arbeit, denn wie bereits auf der MSDN-Website'. . .die /r und /ct "Schalter" für die Referenzierung von Typen sind für die Erstellung von Daten-Verträge. Diese Schalter arbeiten nicht, wenn mit XmlSerializer.'
HTH.
InformationsquelleAutor der Antwort Kelsey
Ich würde einfach erstellen Sie Ihre eigenen xsd.exe. Sorry Probleme einfügen, aber wenn Sie kopieren Sie diesen code in deiner main:
}
InformationsquelleAutor der Antwort Lorick Russow
Habe ich getestet, die die gleichen Befehle auf einem anderen schema, ang, erhielten ähnliche "junk" - Ergebnisse aus svcutil. Also, das könnte ein Weg sein, damit es funktioniert wie xsd.exe, aber bisher alle die Ich gesehen habe sind weit weniger nützlich sind.
Aktualisiert Antwort: ich fand, dass viele dieser generischen arrays von xml-Knoten, die ersetzt wurden durch starke Typen, wenn alle referenzierten XSD ist zwangsweise enthalten. In meinem Fall, ich habe viele xsd-Dateien referenziert, die von jedem anderen, aber svcutil scheint nicht zu zählen. ich hatte, statt zu sagen, es zu verwenden *.xsd-um Sie alle zu erhalten.
InformationsquelleAutor der Antwort Brady Moritz
Habe ich gefunden Xsd2Code viel besser als xsd.exe tut tut genau das, was Sie brauchen. Siehe hier:
http://xsd2code.codeplex.com/
InformationsquelleAutor der Antwort Iain