我正在尝试反序列化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。有什么想法吗?
答案 0 :(得分:3)
使用该设置,它需要
<Stuff>
<Comment>....
<LogLevel>...
...
要处理XML中的两个级别,您需要一个匹配的对象模型。而不是在运行时弄乱XmlRootAttribute,而是在名为Details的属性中编写 一个Details实例的类型Stuff。然后创建序列化程序以期待Stuff实例:
public class Stuff {
public Details Details {get;set;}
}
另一种方法是在输入上使用子阅读器,但这更难。
答案 1 :(得分:0)
当我尝试使用XmlSerializer和FileStreams时,我遇到了很多类似的问题。
我建议将其更改为Linq to XML。我发现学习起来容易得多,速度也快。
这是Mike Taulty的精彩视频