繁体   English   中英

反序列化XML嵌套项

[英]Deserialize XML nested items

您好,我正在尝试获取每个选项的值,如下所示。

<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没有正确显示,我也不知道为什么。

谢谢。

您的问题是您的类型指定了<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>

它没有。

您可以通过用[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM