2016-05-18 9 views
0

こんにちは私は、以下に示すように各オプションの値を取得しようとしています。ネストされたXMLアイテムを逆シリアル化する

<Mailbox> 
    <Menus> 
    <Specs> 
     <Section>Message</Section> 
     <Options> 
      <Option>&amp;New</Option> 
      <Option>&amp;Inbox</Option> 
      <Option>&amp;Outbox</Option> 
      <Option>&amp;Sent Items</Option> 
      <Option>S&amp;ettings</Option> 
     </Options> 
    </Specs> 
    </Menus> 
</Mailbox> 

しかし、私は以下のコードを実行する場合:

[XmlRoot("Mailbox")] 
public class Mailbox 
{ 
    [XmlArray(ElementName = "Menus"), XmlArrayItem("Specs")] 
    public Specs[] Menus { get; set; } 
} 

[XmlRoot("Specs")] 
public class Specs 
{ 
    [XmlElement("Section")] 
    public string Section { get; set; } 
    [XmlArray(ElementName = "Options"), XmlArrayItem("Option")] 
    public Options[] OptionsList { get; set; } 
} 

[XmlRoot("Options")] 
public class Options 
{ 
    [XmlElement("Option")] 
    public string Option { get; set; } 
} 

var deserializer = new XmlSerializer(typeof(Mailbox)); 
var textReader = new StreamReader(filename); 
try 
{ 
     var storage = (Mailbox)deserializer.Deserialize(textReader); 
     for (int i = 0; i < storage.Menus.Length; i++) 
     { 
      MainMenu.Section = storage.Menus[i].Section; 
      MainMenu.Options.Add(storage.Menus[i].Options[i]); 
     } 
} 
catch (Exception e) 
{ 
     MessageBox.Show(e.Message); 
} 
textReader.Close(); 

を私はオプションを取得しておりません。彼らはすべてヌルとして出てくるだけです。 OptionsListは正しく出てこないので、なぜかわからない。

ありがとうございました。

+0

変更atrribute:

あなたはこの余分な[XmlText]Options.Optionをマークすることにより、レベルのネストを排除することができますか? – brumScouse

+0

ネストされたモデルではxmlrootで混乱していますが、これらのeleswhereを作成しない限り、1つしかないと考えられます。 – brumScouse

答えて

1

たいあなたのxmlあたりとして:

[XmlArray(ElementName = "Options"), XmlArrayItem("Option")] 
public Options[] OptionsList { get; set; } 

を示し、そのためのXML配列内の要素が<Option>の外部コンテナ要素<Options>が必要です。しかし、あなたのOptionsタイプは、その値のために追加のネストされた<Option>要素を指定します。このため

[XmlRoot("Options")] 
public class Options 
{ 
    [XmlElement("Option")] // <-- This introduces an additional nested <Option> element. 
    public string Option { get; set; } 
} 

が動作するように、あなたのXMLは次のようになりする必要があります:それはない

<Options> 
     <Option> 
     <Option>&amp;New</Option> 
     </Option> 
    </Options> 

。 XmlArrayItem [オプション]にXmlArrayItem [オプション]からオプションの配列上の

[XmlRoot("Options")] 
public class Options 
{ 
    [XmlText] 
    public string Option { get; set; } 
} 
+0

ありがとう、非常に小さな変更が必要です! – Nolemonpledge

0

こんにちは提出あなたのシリアライズ可能なクラスは以下のあなたの問題は、あなたのタイプは<Option>要素のあまりに多くのレベルを指定することである

[XmlRoot(ElementName = "Options")] 
public class Options 
{ 
    [XmlElement(ElementName = "Option")] 
    public List<string> Option { get; set; } 
} 

[XmlRoot(ElementName = "Specs")] 
public class Specs 
{ 
    [XmlElement(ElementName = "Section")] 
    public string Section { get; set; } 
    [XmlElement(ElementName = "Options")] 
    public Options Options { get; set; } 
} 

[XmlRoot(ElementName = "Menus")] 
public class Menus 
{ 
    [XmlElement(ElementName = "Specs")] 
    public Specs Specs { get; set; } 
} 

[XmlRoot(ElementName = "Mailbox")] 
public class Mailbox 
{ 
    [XmlElement(ElementName = "Menus")] 
    public Menus Menus { get; set; } 
} 
+0

このクラスでは、オプションリストをシリアライズしてアクセスできるはずです – Maddy

関連する問題