[英]Deserialize XML nested items
您好,我正在尝试获取每个选项的值,如下所示。
<Mailbox>
<Menus>
<Specs>
<Section>Message</Section>
<Options>
<Option>&New</Option>
<Option>&Inbox</Option>
<Option>&Outbox</Option>
<Option>&Sent Items</Option>
<Option>S&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没有正确显示,我也不知道为什么。
谢谢。
您的问题是您的类型指定了<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>&New</Option>
</Option>
</Options>
它没有。
您可以通过用[XmlText]
标记Options.Option
来消除这种额外的层次嵌套:
[XmlRoot("Options")]
public class Options
{
[XmlText]
public string Option { get; set; }
}
嗨,根据您的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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.