2016-05-18 83 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