反序列化XML元素返回NULL

本文关键字:NULL 返回 元素 XML 反序列化 | 更新日期: 2023-09-27 18:05:10

我正在尝试反序列化XML文件。但是,我只需要文件中的两个元素。下面是基本的标记:

<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无论我做什么。什么好主意吗?

反序列化XML元素返回NULL

在这个设置中,它期望

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

要处理XML中的两个层次,需要一个匹配的对象模型。与其在运行时乱搞XmlRootAttribute,不如编写一个类型Stuff,让在一个名为Details的属性中拥有一个Details实例。然后创建序列化器以期望一个Stuff实例:

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

另一种方法是在输入上使用子阅读器,但这更难。

当我尝试使用XmlSerializer和FileStreams时,我遇到了很多类似的问题。

我建议将其更改为Linq to XML。我发现它学起来容易多了,也快多了。

这是Mike Taulty的一个很棒的视频

Linq to XML教程