2016-06-06 18 views
-1

Ich habe folgende xml:XML-Parsing - Code Refactoring Ausgabe

<?xml version="1.0" encoding="utf-8"?> 
<RootData> 
    <PassResult> 
    <FirstOne>P1</FirstOne> 
    <SecondOne>P2</SecondOne> 
<IsMale>false</IsMale> 
</PassResult> 
<TestResult> 
    <MarkOne>100</MarkOne> 
    <MarkTwo>50</MarkTwo> 
    <Slope>30</Slope> 
</TestResult> 
<ToneTestResult> 
    <TotalTime>2</TotalTime> 
    <CorrectPercentage>90</CorrectPercentage> 
</ToneTestResult> 
<QuestionnaireResult Version="1"> 
    <Question Id="50"> 
    <Answer Id="B" /> 
</Question> 
    <Question Id="60"> 
    <Answer Id="A" /> 
</Question> 
</QuestionnaireResult> 
</RootData> 

Ich habe den folgenden Code, die überhaupt nicht einen guten suchen. Viele wiederholte Linkanfragen. Wie kann ich diesen Code strukturierter umstrukturieren, um "OutputData" -Objekt zu füllen. Ich will nicht, es zu XmlSerializer ändern jetzt :-(

Beispielcode:.

// Gets the root element decendants 
     var elementRootData = xDocument.Descendants("RootData"); 

     var xElements = elementRootData as IList<XElement> ?? 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); 
     } 

Ich habe etwas mehr Code wie diesen zu schreiben, um andere Elemente Daten wie ToneTestResult zu füllen, QuestionnaireResult usw. Can jemand mit einem Beispielcode vorschlagen?

mit freundlichen Grüßen,

+1

Wenn Sie ganze xml in Objekt benötigen warum Deserialisieren Sie nicht xml? – niksofteng

+0

Optionen hier: http://stackoverflow.com/questions/13171525/converting-xml-to-a-dynamic-c-sharp-object –

Antwort

0

Angesichts Ihrer XML ist winzig, haben Sie wahrscheinlich zu viel nicht um Leistung zu kümmern. Sie können tun, nur das ganze in einem Rutsch, Gebrauch machen von dem Gebäude t in expliziten Konvertierungen:

var data = new OutputData 
{ 
    FirstOne = (string) doc.Descendants("FirstOne").Single(), 
    SecondOne = (string) 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() 
}; 

Als beiseite, Descendants werden nie etwas zurückgeben IList<XElement> Implementierung, so dass Sie auf jeden Fall, dass entfernen.

0

Try 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 string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      var root = doc.Elements("RootData").Select(x => new 
      { 
       passResults = x.Elements("PassResult").Select(y => new 
       { 
        firstOne = (string)y.Element("FirstOne"), 
        secondOne = (string)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.Attribute("Id"), 
        answer = (string)y.Descendants("Answer").FirstOrDefault().Attribute("Id") 
       }).ToList(), 
      }).FirstOrDefault(); 

     } 
    } 
}