2011-08-11 18 views
1

XMLファイルを逆シリアル化しようとしています。しかし、私はファイルから2つの要素だけを必要とします。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

、それはあなたが一致するオブジェクトモデルが必要になりますXMLに2つのレベルを処理するには

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

を期待しています。実行時にXmlRootAttributeを使いこなすのではなく、というDetailsインスタンスをDetailsという名前のStuff型で記述します。次に、スタッフインスタンスを期待するシリアライザを作成する:

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

別のアプローチは、入力上のサブリーダーを使用することであろうが、それは困難です。

+0

恐ろしいことで素晴らしいビデオです!ありがとうMarc。 – bl4kh4k

0

XmlSerializerとFileStreamsを使用しようとしたときに、私は多くの同様の問題に遭遇しました。

これをLinqに変更することをお勧めします。私はそれがもっと簡単で、より速く学ぶことがわかった。ここで

が魅力のように働いた、マイク・Taulty

Linq to XML Tutorial

関連する問題