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

我有這樣的XML, 應該怎麼類模型,所以我將能夠使用XmlSerializer對象進行反序列化呢?如何反序列化XML到對象

回答

136

你的類應該喜歡這樣

[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; } 
} 

這是我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); 
} 

如果你想讀的文本文件,你應該將文件加載到一個FileStream 和反序列化這一點。

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

[的XmlElement( 「步」)是關鍵 - 刪除 「臺階」 在XML嵌套( ...) – avs099

+1

我不明白。當然'[XmlElement(「Step」)]'是關鍵,是對的。你的意思是「 - 刪除」step「嵌套在XML中( ...)」。謝謝! – dknaack

+1

它不是爲你,但別人誰可能來讀這個答案:)如果你沒有[的XmlElement],然後生成的XML將是這樣的:名1名2。前段時間我花了一段時間才弄清楚如何去除外部塊。 – avs099

12

上述評論是正確的。你錯過了裝飾者。 如果你想要一個通用的解串器,你可以使用它。

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; 
    } 

那麼你還是這樣稱呼它:

MyObjType MyObj = DeserializeXMLFileToObject<MyObjType>(FilePath);