2013-03-13 6 views
11

के साथ सी # में ऐरे की बजाय सूची कैसे उत्पन्न करें मेरे पास एक एक्सएमएल स्कीमा .xsd है और xsd.exe उपकरण सभी सी # कक्षाओं के साथ मेरी फ़ाइल के साथ उत्पन्न करें। अगर मेरे पास एक एक्सएमएल टैग के भीतर तत्वों का अनुक्रम है, तो उसे एरे के साथ सी # में दर्शाया जाएगा। FAIL स्पष्ट है। मैं Arrays के बजाय सूची कैसे उत्पन्न कर सकता हूँ?xsd.exe

कक्षा में निश्चित आकार के सरणी के बजाय, मैं सूचियों का उपयोग करना चाहता हूं।

Book [] books = new Book[someFixSize]; 

List<Book> books = new List<Book>(); 

मैं कुछ पुराने (बहुत पुरानी) इस बारे में सवाल देखा है, लेकिन उनमें से कोई भी एक संतुष्ट समाधान प्रदान: http://www.stefanbader.ch/xsdcsarr2l-exe-refactor-xsd-array-to-list/

उत्तर

6

मैं svcutil उपयोग करने की कोशिश में एक ही समस्या में पड़, अनुबंध होने कारण है कि मैं भी xsdcsarr2l लिखा था के लिए बिना एल। यदि आप रुचि रखते हैं तो मैं समय लेता हूं और एक नया संस्करण अपलोड करता हूं जहां कम से कम सूची चर स्वचालित रूप से प्रारंभ हो जाते हैं। दूसरी ओर, परियोजना पर्याप्त प्रकाश है, कि आप स्रोत ले सकते हैं और एनआरफैक्ट्री कक्षाओं का उपयोग करके इसे स्वयं सुधार सकते हैं।

+0

क्या आप उस पंक्ति को प्रतिस्थापित कर रहे हैं जिसमें एक सूची के साथ एक ऐरे [] है? या कोड के किसी अन्य लाइन भी संपादित हैं? – Gero

+0

बस लाइनें जहां निश्चित सरणी शामिल हैं। उपकरण सी # -सोर्स को पार्स कर रहा है और इसे एनआरफैक्ट्री की मदद से एएसटी (सार सिंटेक्स ट्री) में स्थानांतरित कर रहा है। तो परिवर्तन एक मजबूत तरीके से लागू होते हैं। विचार मूल के जितना संभव हो उतना स्पर्श करना था। – EvilBad

+0

हाँ, नवीनतम संस्करण अपलोड करें। – Gero

2

svcutil उपयोग करके देखें:/

यह नवीनतम उपयोगी संकेत है। exe

svcutil /o:myFile.cs /ct:System.Collections.Generic.List myXsd.xsd 
+1

मैं अपने XSD में कोई Datacontracts है तो svcutil – Gero

+0

काम नहीं करेगा मुझे लगता है कि अपने ही एकमात्र विकल्प मैन्युअल refactor करने के लिए ऑटो कोड उत्पन्न है। – CathalMF

0

Xsd2Code

यह सरणियों के बजाय सूचियों उत्पन्न करता है की कोशिश करो। दुर्भाग्य से मैं इसे अपने कोड को deserialize करने के लिए नहीं मिल सका, लेकिन इसे xsd द्वारा उत्पन्न कोड से तुलना करना यह बहुत समान दिखता था।

+0

nov2015 - xsd2code विक्रेता पूरी तरह उत्तरदायी नहीं है। एक परीक्षण लाइसेंस और ईमेल बाउंस नहीं मिल सकता है। मुझे लगता है कि इसे छोड़ दिया गया है। –

0

मैं हाल ही में एक ही समस्या में भाग गया, एकमात्र कारण मैं चाहता था कि टी [] की बजाय सूची [क्योंकि] मैं वेब सेवा के लिए अनुरोध भेजने से पहले सरणी में आइटम जोड़ना चाहता था। मैंने इस तथ्य का उपयोग किया कि xsd.exe आंशिक वर्ग उत्पन्न करता है। आप अपने स्वयं के आंशिक वर्ग को एक कन्स्ट्रक्टर और एक एडीडीटी विधि जोड़ सकते हैं जो (नया) अंतिम तत्व को असाइन करने से पहले Array.Resize() का उपयोग करेगा। जेनरेट कोड को बदलने या किसी अन्य उपकरण का उपयोग करने की आवश्यकता नहीं है।

0

डैन फील्ड में powershell script है जो xsd.exe आउटपुट क्लास लेता है और इसके सरणी जेनेरिक सूचियों में बदल जाता है। इसने मेरे लिए एक साधारण वर्ग के साथ अच्छा काम किया है, लेकिन मुझे नहीं पता कि यह कितना अच्छा है। मैंने नीचे लिपि चिपकाई है। कमांड प्रॉम्प्ट से कॉल करें

"$(TargetFrameworkSDKToolsDirectory)xsd.exe" /c "$(ProjectDir)ImportedPartCanonical.xsd" "$(ProjectDir)ProjectCanonical.xsd" /n:Tallan.BT.PipelineComponents 

powershell.exe -ExecutionPolicy Unrestricted -file "$(solutiondir)\PowerShellScripts\PostProcessXsdExe.ps1" ProjectCanonical.cs "$(SolutionDir)Tallan.BT.PipelineComponents\SerializedClasses\ProjectCanonical.cs" 

पूर्ण स्पष्टीकरण के लिए लिंक देखें।

# Author: Dan Field ([email protected]) 
# posted on blog.tallan.com/2016/03/10/xsd-exe-arrays-and-specified 
# Purpose: fix the 'specified' attribute and convert arrays to list from XSD.exe generated classes 

[CmdletBinding()] 
Param(
    [Parameter(Mandatory=$true,Position=1)] 
    [string]$inputFile, 
    [Parameter(Mandatory=$true,Position=2)] 
    [string]$outputFile, 
    [switch]$DeleteInputFile 
) 

# much faster than using Get-Content and/or Out-File/Set-Content 
$writer = [System.IO.StreamWriter] $outputFile 
$reader = [System.IO.StreamReader] $inputFile 

# used to track Specified properties 
$setterDict = @{} 

while (($line = $reader.ReadLine()) -ne $null) 
{ 
    $thisStart = $line.IndexOf("this.") # will be used for 
    $brackets = $line.IndexOf("[]") # indicates an array that will be converted to a Generic List 

    # assume that any private field that contains "Specified" needs to be grabbed 
    if (($line.IndexOf("private") -gt -1) -and ($line.IndexOf("Specified") -gt -1)) 
    { 
     # get the field name 
     $varName = $line.Split("{' ',';'}", [System.StringSplitOptions]::RemoveEmptyEntries)[-1] 
     # use field name as a key, minus the ending "Specified" portion, e.g. fieldNameSpecified -> fieldName 
     # the value in the dictionary will be added to setters on the main property, e.g. "this.fieldNameSpecified = true;" 
     $setterDict.Add($varName.Substring(0, $varName.IndexOf("Specified")), "this." + $varName + " = true;") 
     # output the line as is 
     $writer.WriteLine($line) 
    } 
    # find property setters that aren't for the *Specified properties 
    elseif (($thisStart -gt -1) -and ($line.IndexOf(" = value") -gt -1) -and ($line.IndexOf("Specified") -lt 0)) 
    { 
     # get the field name 
     $thisStart += 5 
     $varName = $line.Substring($thisStart, $line.IndexOf(' ', $thisStart) - $thisStart) 
     # see if there's a "Specified" property for this one 
     if ($setterDict.ContainsKey($varName) -eq $true) 
     { 
      # set the Specified property whenever this property is set 
      $writer.WriteLine((' ' * ($thisStart - 5)) + $setterDict[$varName]) 
     } 
     # output the line itself 
     $writer.WriteLine($line) 
    } 
    elseif ($brackets -gt 0) # change to List<T> 
    { 
     $lineParts = $line.Split(' ') 
     foreach ($linePart in $lineParts) 
     { 
      if ($linePart.Contains("[]") -eq $true) 
      { 
       $writer.Write("System.Collections.Generic.List<" + $linePart.Replace("[]", "> ")) 
      } 
      else 
      { 
       $writer.Write($linePart + " ") 
      } 
     } 
     $writer.WriteLine(); 
    } 
    else # just output the original line 
    { 
     $writer.WriteLine($line) 
    } 
} 

if ($DeleteInputFile -eq $true) 
{ 
    Remove-Item $inputFile 
}  

# Make sure the file gets fully written and clean up handles 
$writer.Flush(); 
$writer.Dispose(); 
$reader.Dispose(); 
संबंधित मुद्दे