2016-05-18 112 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上述選項陣列從XmlArrayItem [選項] XmlArrayItem [選項]? – brumScouse

+0

在嵌套模型上,xmlroot有點困惑,以爲只有一個,除非你編寫這些eleswhere。 – brumScouse

回答

1

你的問題是,你的類型指定<Option>元素的層次太多:

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

指示XML的數組應該有一個外部容器元素<Options>,內部元素<Option>。但是,你的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> 

它不。

可以消除標記Options.Option[XmlText]這個額外的級別嵌套:

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

謝謝,需要非常小的更改! – Nolemonpledge

0

你好根據你的XML文件的序列化的類想下面

[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