2009-08-07 10 views
20

मैं xsd.exe का उपयोग कर रहा हूं ताकि एक .xsd फ़ाइल से कुछ सी # कक्षाएं उत्पन्न हो सकें। मैं उसी समस्या में भाग गया जो यहां और अन्य साइटों पर शामिल है जहां xsd.exe .xsd फ़ाइल में प्रकारों के लिए सामान्य सूची संग्रह के बजाय प्रकार [] arrays उत्पन्न करता है। कुछ लोगों ने सुझाव दिया है कि svcutil.exe को xsd.exe के प्रतिस्थापन के रूप में उपयोग किया जा सकता है यदि आप svcutil.exe पर/dataContract केवल पैरामीटर पास करते हैं। हालांकि, ऐसा लगता है कि उन लोगों को गलत माना जाता है क्योंकि svcutil.exe वास्तव में .xsd फ़ाइल में स्कीमा के आधार पर प्रकार बनाने के बजाय System.Xml.XmlNode [] सरणी गुण उत्पन्न करता है।क्या svcutil.exe xsd.exe के लिए एक प्रतिस्थापन है?

उदाहरण के लिए, इस सरल .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/वर्गों 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/लक्ष्य: कोड/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; 
    } 
} 
  1. क्या svcutil.exe वास्तव में xsd.exe के प्रतिस्थापन माना जाता है? उत्पन्न उत्पादन काफी अलग लगता है।

  2. इस बिंदु पर, ऐसा लगता है कि मैं xsd.exe उपयोग करने के लिए मेरी .XSD फ़ाइल से कक्षाएं बनाने के लिए करना होगा और फिर मैन्युअल रूप मैं चाहता हूँ में इसे पाने के लिए कोड में और सुधार। मुझे एहसास है कि पूरी तरह से जेनरेट कोड का उपयोग आदर्श होगा, लेकिन मैं सोच रहा था कि क्या अन्य लोग xsd.exe का उपयोग शुरुआती बिंदु के रूप में कर रहे हैं और फिर वहां से काम कर रहे हैं या यदि मुझे एक और दृष्टिकोण पूरी तरह से विचार करने की आवश्यकता है?

  3. क्या विजुअल स्टूडियो 2010 में xsd.exe के लिए कोई अपडेट हैं?

+0

svcutil xsd.exe के प्रतिस्थापन के रूप में नहीं था। जितना हो सके उतने करीब पहुंचने के लिए, '/ dataContractOnly' और'/serializer: XmlSerializer' स्विच का उपयोग करने का प्रयास करें। –

+0

सेवा उपयोग 'xs: all' विकल्प द्वारा भ्रमित हो रहा है। यदि आपका एक्सएसडी 'xs: अनुक्रम' का उपयोग कर रहा था, तो svcUtil उचित आउटपुट उत्पन्न करेगा। डेटाकंट्रैक सीरियलाइज़र और svcUtil पर दस्तावेज़ों से: xs: सभी - निषिद्ध। http://msdn.microsoft.com/en-us/library/ms733112(v=vs.110).aspx – jessehouwing

+0

आप एक ही सवाल [यहां] करने के लिए अपने उत्तर मिल सकता है [1] [1 ]: http://stackoverflow.com/a/24557248/1125467 – vivekp

उत्तर

6

हाँ, svcutil.exexsd.exe के लिए एक स्थानापन्न के रूप में इस्तेमाल किया जा सकता है, लेकिन यह लगता है कि आप उत्पन्न करने मुसीबत सामान्य संग्रह हो रही हो रही है।

svcutil /o:Svc.cs /ct:System.Collections.Generic.List`1 http://example.com 
+0

मैंने जेनरेट किए गए आउटपुट को दिखाने के लिए ऊपर एक उदाहरण जोड़ा। – jameswelle

1

मैं एक स्कीमा पर एक ही आदेशों का परीक्षण किया है, आंग svcutil से समान "जंक" परिणाम प्राप्त किया: svcutil.exe एक collectionType स्विच है कि आप प्रकार एक संग्रह के लिए प्रयोग की जाने वाली निर्दिष्ट करने के लिए अनुमति देता है। तो, यह xsd.exe की तरह काम करने का एक तरीका हो सकता है, लेकिन अब तक मैंने देखा है कि बहुत कम उपयोगी हैं।


अपडेट किया गया जवाब: मैंने पाया कि एक्सएमएल नोड्स के इन सामान्य सरणियों के कई मजबूत प्रकार से प्रतिस्थापित किया गया है जब सभी संदर्भित XSD के जबरन शामिल किए गए हैं। मेरे मामले में, मेरे पास एक-दूसरे द्वारा संदर्भित कई एक्सएसडी फाइलें हैं, लेकिन svcutil में उन्हें शामिल नहीं लगता है। मुझे इसे सभी को प्राप्त करने के लिए * .xsd का उपयोग करने के लिए कहा था।

+0

क्या यह सवाल का उत्तर था? यह एक प्रश्न की तरह लगता है। यदि ऐसा है, तो आपको एक अलग सवाल पूछना चाहिए। –

+0

मैंने इसे अपडेट किया, लेकिन सवाल की समीक्षा करने के बाद, मुझे लगता है कि मेरा जवाब अभी भी लागू नहीं है क्योंकि उसकी स्कीमा सभी समावेशी प्रतीत होती है, जिनके साथ मैं काम कर रहा हूं। –

+1

न तो svcutil और न ही xsd.exe स्वचालित रूप से शामिल फ़ाइलों का संदर्भ देगा। दोनों मामलों में, आपको उन्हें बताना होगा कि कौन सी फाइलें देखना है। –

2

मैं बस अपना स्वयं का xsd.exe बनाउंगा।क्षमा करें मुसीबत चिपकाने होने, लेकिन आप में इस कोड को कॉपी करता है, तो आपका मुख्य:

 XmlSchemas xsds = new XmlSchemas(); 
     xsds.Add(xsd); 
     xsds.Compile(null, true); 
     XmlSchemaImporter schemaImporter = new XmlSchemaImporter(xsds); 

     // create the codedom 
     CodeNamespace codeNamespace = new CodeNamespace(strNamespace); 
     XmlCodeExporter codeExporter = new XmlCodeExporter(codeNamespace); 

     List<XmlTypeMapping> maps = new List<XmlTypeMapping>(); 
     foreach (XmlSchemaType schemaType in xsd.SchemaTypes.Values) 
     { 
      maps.Add(schemaImporter.ImportSchemaType(schemaType.QualifiedName)); 
     } 
     foreach (XmlSchemaElement schemaElement in xsd.Elements.Values) 
     { 
      maps.Add(schemaImporter.ImportTypeMapping(schemaElement.QualifiedName)); 
     } 
     foreach (XmlTypeMapping map in maps) 
     { 
      codeExporter.ExportTypeMapping(map); 
     } 

     ReplaceArrayWithList(codeNamespace); 

     // Check for invalid characters in identifiers 
     CodeGenerator.ValidateIdentifiers(codeNamespace); 

     // output the C# code 
     CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 

     using (StreamWriter writer = new StreamWriter(strCsPath, false)) 
     { 
      codeProvider.GenerateCodeFromNamespace(codeNamespace, writer, new CodeGeneratorOptions()); 
     } 
    } 
    private static void ReplaceArrayWithList(CodeNamespace codeNamespace) 
    { 
     codeNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic")); 
     foreach (CodeTypeDeclaration codeType in codeNamespace.Types) 
     { 
      foreach (CodeTypeMember member in codeType.Members) 
      { 
       if (member is CodeMemberField) 
       { 
        CodeMemberField field = (CodeMemberField)member; 
        if (field.Type.ArrayRank > 0) 
        { 
         CodeTypeReference type = new CodeTypeReference(); 
         type.BaseType = "List<" + field.Type.BaseType + ">"; 
         field.Type = type; 
        } 
       } 
       if (member is CodeMemberProperty) 
       { 
        CodeMemberProperty property = (CodeMemberProperty)member; 
        if (property.Type.ArrayRank > 0) 
        { 
         CodeTypeReference type = new CodeTypeReference(); 
         type.BaseType = "List<" + property.Type.BaseType + ">"; 
         property.Type = type; 
        } 
       } 
      } 
     } 
    } 

} 

}

+0

-1: क्या यह उसकी समस्या का समाधान करता है? –

4

स्पष्टीकरण

ऊपर होगा काम एंड्रयू हरे का जवाब है, लेकिन उदाहरण के आदेश है कि बस चिपकाया jameswelle कोड के अपने अंतिम खंड के ऊपर:

svcutil.exe /target:code /dataContractOnly /serializer:XmlSerializer /importXmlTypes /collectionType:System.Collections.Generic.List`1 Example.xsd

नहीं है काम क्योंकि as stated on MSDN, '। । /आर और /सीटी संदर्भ प्रकारों के लिए स्विच डेटा अनुबंध उत्पन्न करने के लिए हैं। XmlSerializer का उपयोग करते समय ये स्विच काम नहीं करते हैं। '

एचटीएच।

1

मुझे Xsd2Cexe की तुलना में Xsd2Cex की तुलना में काफी बेहतर होने के लिए मिला है जो आपको चाहिए। यहां देखें: http://xsd2code.codeplex.com/

संबंधित मुद्दे