2012-05-09 28 views
68
<StepList> 
    <Step> 
    <Name>Name1</Name> 
    <Desc>Desc1</Desc> 
    </Step> 
    <Step> 
    <Name>Name2</Name> 
    <Desc>Desc2</Desc> 
    </Step> 
</StepList> 

Mam ten XML, Jak mam model klasy, więc będą mogli deserializowania go za pomocą XmlSerializer obiekt?Jak deserializować xml do obiektu

Odpowiedz

136

klasach chciałbym tak

[XmlRoot("StepList")] 
public class StepList 
{ 
    [XmlElement("Step")] 
    public List<Step> Steps { get; set; } 
} 

public class Step 
{ 
    [XmlElement("Name")] 
    public string Name { get; set; } 
    [XmlElement("Desc")] 
    public string Desc { get; set; } 
} 

Oto moja testcode.

string testData = @"<StepList> 
         <Step> 
          <Name>Name1</Name> 
          <Desc>Desc1</Desc> 
         </Step> 
         <Step> 
          <Name>Name2</Name> 
          <Desc>Desc2</Desc> 
         </Step> 
        </StepList>"; 

XmlSerializer serializer = new XmlSerializer(typeof(StepList)); 
using (TextReader reader = new StringReader(testData)) 
{ 
    StepList result = (StepList) serializer.Deserialize(reader); 
} 

Jeśli chcesz przeczytać plik tekstowy należy załadować plik do FileStream i deserializowania to.

using (FileStream fileStream = new FileStream("<PathToYourFile>",FileMode.Open)) 
{ 
    StepList result = (StepList) serializer.Deserialize(fileStream); 
} 
+1

[XmlElement ("Step")] jest kluczem - aby usunąć "krok" zagnieżdżanie w XML ( ...) – avs099

+1

Nie rozumiem. Oczywiście '[XmlElement (" Step ")]' jest kluczem, ma rację. Co rozumiesz przez "- usunięcie" kroku "zagnieżdżanie w XML ( ...)". Dziękuję Ci! – dknaack

+1

to nie dla ciebie, ale dla innych, którzy mogą być przeczytaniu tej odpowiedzi :) Jeśli nie masz [XmlElement] Następnie otrzymaną XML będzie tak: Nazwa1 name2. Zajęło mi trochę czasu, aby dowiedzieć się, jak usunąć zewnętrzny blok . – avs099

12

Powyższe komentarze są poprawne. Tęsknisz za dekoratorami. Jeśli chcesz ogólny deserializer, możesz go użyć.

public static T DeserializeXMLFileToObject<T>(string XmlFilename) 
    { 
     T returnObject = default(T); 
     if (string.IsNullOrEmpty(XmlFilename)) return default(T); 

     try 
     { 
      StreamReader xmlStream = new StreamReader(XmlFilename); 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      returnObject = (T)serializer.Deserialize(xmlStream); 
     } 
     catch (Exception ex) 
     { 
      ExceptionLogger.WriteExceptionToConsole(ex, DateTime.Now); 
     } 
     return returnObject; 
    } 

Wtedy to nazwać tak:

MyObjType MyObj = DeserializeXMLFileToObject<MyObjType>(FilePath); 
Powiązane problemy