Я использую xsd.exe для генерации некоторых классов c # из файла .xsd. Я столкнулся с той же проблемой, что и здесь, и на других сайтах, где xsd.exe генерирует массивы Type [] вместо общих списков для типов в файле .xsd. Некоторые люди считают, что svcutil.exe можно использовать в качестве замены xsd.exe, если передать параметр / dataContractOnly в svcutil.exe. Однако кажется, что эти люди ошибаются, потому что svcutil.exe фактически генерирует свойства массива System.Xml.XmlNode [] вместо создания типов на основе схемы в файле .xsd.
Например, для этой простой схемы .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' создает:
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' создает:
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;
}
}
Действительно ли svcutil.exe должен заменить xsd.exe? Сгенерированный вывод выглядит совершенно другим.
На данный момент похоже, что мне придется использовать xsd.exe для создания классов из моего файла .xsd, а затем вручную настроить код, чтобы получить его в нужной форме. Я понимаю, что использование чисто сгенерированного кода было бы идеальным, но мне было интересно, если другие люди используют xsd.exe в качестве отправной точки, а затем работают оттуда, или мне вообще нужно рассмотреть другой подход?
Есть ли какие-либо обновления для xsd.exe в Visual Studio 2010?