2011-08-11 164 views
1

我想反序列化一個XML文件。但是,我只需要文件中的兩個元素。這裏是基本的標記:反序列化XML元素返回NULL

<Stuff> 
    <Details> 
    <Comment>I want whats in here.</Comment> 
    <LogLevel>And here too.</LogLevel> 
    </Details> 
<Stuff> 

反序列化我做了以下內容:

XmlSerializer deserializer; 
FileStream stream = new FileStream(CONFIG_PATH, FileMode.Open); 
XmlReader reader = new XmlTextReader(stream); 

XmlRootAttribute xRoot = new XmlRootAttribute(); 
xRoot.ElementName = "Stuff"; 
xRoot.IsNullable = true; 

// Details configuration area. 
Utilities.Details d = new Utilities.Details(); 
deserializer = new XmlSerializer((typeof(Details)), xRoot); 
d = (Details)deserializer.Deserialize(reader); 

System.Windows.MessageBox.Show(d.Comment); 

最後保存的對象類:

/// <summary> 
/// Configuration details. 
/// </summary> 
[Serializable()] 
[XmlRoot(ElementName = "Details", IsNullable = true)] 
public sealed class Details 
{ 
    public Details() 
    { 

    } 

    [XmlElement("Comment")] 
    public string Comment { get; set; } 

    [XmlElement("LogLevel")] 
    public string LogLevel { get; set; } 
} 

然而d.Comment和d無論我做什麼,LogLevel都會繼續返回null。有任何想法嗎?

回答

3

使用這個配置,預計

<Stuff> 
    <Comment>.... 
    <LogLevel>... 
    ... 

以處理XML兩個層次,您將需要一個匹配的對象模型。而不是在運行時弄亂XmlRootAttribute,寫一個類型爲Stuff的具有的Details實例在名爲Details的屬性中。然後創建序列化程序以期望Stuff實例:

public class Stuff { 
    public Details Details {get;set;} 
} 

另一種方法是在輸入上使用子閱讀器,但這比較困難。

+0

真棒,工作就像一個魅力!謝謝馬克。 – bl4kh4k

0

當我嘗試使用XmlSerializer和FileStreams時遇到了很多類似的問題。

我建議將此更改爲Linq to XML。我發現學習起來更容易,更快速。

下面是麥克Taulty一個偉大的視頻

Linq to XML Tutorial