Analyse XML – Problème de refactoring de code

J’ai le XML suivant:

   P1 P2 false   100 50 30   2 90           

J’ai le code suivant qui ne ressemble pas du tout à un bon. Beaucoup de requêtes de lien répétitif. Comment puis-je refactoriser ce code d’une manière plus structurée pour remplir l’object “OutputData”. Je ne veux pas le changer maintenant pour XmlSerializer :-(.

Exemple de code:

  // Gets the root element decendants var elementRootData = xDocument.Descendants("RootData"); var xElements = elementRootData as IList ?? elementRootData.ToList(); // Read first leaf node "ProfileResult" var passResult = from xElement in xElements.Descendants("PassResult") select new { FirstOne = xElement.Element("FirstOne").GetValue(), SecondOne = xElement.Element("SecondOne").GetValue(), IsMale = xElement.Element("IsMale").GetValue() }; // Read second leaf note var testResult = from xElement in xElements.Descendants("TestResult") select new { MarkOne = xElement.Element("MarkOne").GetValue(), MarkTwo = xElement.Element("MarkTwo").GetValue(), Slope = xElement.Element("Slope").GetValue() }; // Update OutputData object var parseOutputData = new OutputData(); foreach (var result in passResult) { parseOutputData.FirstOne = result.FirstOne; parseOutputData.SecondOne = result.SecondOne; parseOutputData.IsMale = result.IsMale.Equals("True"); } foreach (var result in testResult) { parseOutputData.MarkOne = double.Parse(result.MarkOne); parseOutputData.MarkTwo = double.Parse(result.MarkTwo); parseOutputData.Slope = double.Parse(result.Slope); } 

Je dois écrire un peu plus de code comme celui-ci pour remplir d’autres données d’éléments comme ToneTestResult, QuestionnaireResult etc. Quelqu’un peut-il suggérer un exemple de code?

Meilleures salutations,

Étant donné que votre XML est minuscule, vous n’avez probablement pas à vous soucier de la performance. Vous pouvez tout faire en une fois, en utilisant les conversions explicites intégrées:

 var data = new OutputData { FirstOne = (ssortingng) doc.Descendants("FirstOne").Single(), SecondOne = (ssortingng) doc.Descendants("SecondOne").Single(), IsMale = (bool) doc.Descendants("IsMale").Single(), MarkOne = (double) doc.Descendants("MarkOne").Single(), MarkTwo = (double) doc.Descendants("MarkTwo").Single(), Slope = (double) doc.Descendants("Slope").Single() }; 

En IList , les Descendants ne IList jamais rien mettant en œuvre IList , vous pouvez donc définitivement le supprimer.

Essayez XML Linq

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { const ssortingng FILENAME = @"c:\temp\test.xml"; static void Main(ssortingng[] args) { XDocument doc = XDocument.Load(FILENAME); var root = doc.Elements("RootData").Select(x => new { passResults = x.Elements("PassResult").Select(y => new { firstOne = (ssortingng)y.Element("FirstOne"), secondOne = (ssortingng)y.Element("SecondOne"), isMale = (Boolean)y.Element("IsMale") }).FirstOrDefault(), testResult = x.Elements("TestResult").Select(y => new { markOne = (int)y.Element("MarkOne"), markTwo = (int)y.Element("MarkTwo"), slope = (int)y.Element("Slope") }).FirstOrDefault(), toneTestResult = x.Elements("ToneTestResult").Select(y => new { totalTime = (int)y.Element("TotalTime"), correctPecentage = (int)y.Element("CorrectPercentage") }).FirstOrDefault(), questionnaireResult = x.Elements("QuestionnaireResult").Elements("Question").Select(y => new { question = (int)y.Atsortingbute("Id"), answer = (ssortingng)y.Descendants("Answer").FirstOrDefault().Atsortingbute("Id") }).ToList(), }).FirstOrDefault(); } } }