2011-08-11 36 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