反序列化数组元素以列出

发布于 2025-01-06 04:02:26 字数 935 浏览 4 评论 0原文

我有以下 XML......

<configuration>
    <img name="name1" />
    <img name="name2" />
    <warn>
        <img name="warn1" />
    </warn>
</configuration>

我尝试将其反序列化为......

[XmlType("img")]
public class ImageNameExceptionItemXml
{
    [XmlAttribute("name")]
    public string Filename;
}

[XmlRoot("configuration")]
public class ImageNameExceptionListXml: List<ImageNameExceptionItemXml>
{
    [XmlArray("warn")]
    [XmlArrayItem("img")]
    public ImageNameExceptionListXml WarnList { get; set; }
}

但最终得到 WarnList 属性为 null。

我已经尝试过...

[XmlElement("warn"}]
public ImageNameExceptionListXml WarnList { get; set; }

...或者...

[XmlElement("warn"}]
public List<ImageNameExceptionItemXml> WarnList { get; set; }

...但我仍然以 WarnList 属性为空。这是为什么?

I have the following XML...

<configuration>
    <img name="name1" />
    <img name="name2" />
    <warn>
        <img name="warn1" />
    </warn>
</configuration>

...which I try to deserialize into...

[XmlType("img")]
public class ImageNameExceptionItemXml
{
    [XmlAttribute("name")]
    public string Filename;
}

[XmlRoot("configuration")]
public class ImageNameExceptionListXml: List<ImageNameExceptionItemXml>
{
    [XmlArray("warn")]
    [XmlArrayItem("img")]
    public ImageNameExceptionListXml WarnList { get; set; }
}

...but I end up with the WarnList property null.

I already tried...

[XmlElement("warn"}]
public ImageNameExceptionListXml WarnList { get; set; }

...or...

[XmlElement("warn"}]
public List<ImageNameExceptionItemXml> WarnList { get; set; }

...but I still end up with WarnList property null. Why is that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你没皮卡萌 2025-01-13 04:02:26

让我们直奔问题吧。 warn 是一个“根”元素,因此,您也必须在类中对其进行转换:

xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <img name="name1" />
  <img name="name2" />
  <warn>
      <img name="warn1" />
      <img name="warn2" />
  </warn>
</configuration>

类:

[XmlType("img")]
public class ImageNameExceptionItemXml 
{ 
    [XmlAttribute("name")]     
    public string Filename; 
}

[XmlType("warn")]
public class WarnExceptionItemXml
{
    [XmlElement("img")]
    public List<ImageNameExceptionItemXml> ImgList { get; set; }
}

[XmlRoot("configuration")]
public class ImageNameExceptionListXml
{
    [XmlElement("img")]
    public List<ImageNameExceptionItemXml> ImgList { get; set; }

    [XmlElement("warn")]
    public WarnExceptionItemXml WarnList { get; set; } 
}

以及反序列化测试:

XmlSerializer xml = new XmlSerializer(typeof(ImageNameExceptionListXml));

ImageNameExceptionListXml teste = (ImageNameExceptionListXml)xml.Deserialize(new FileStream("XMLFile1.xml", FileMode.Open));

Let's go to the problem. The warn is a "root" element, so, you have to transform it in a class too:

The xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <img name="name1" />
  <img name="name2" />
  <warn>
      <img name="warn1" />
      <img name="warn2" />
  </warn>
</configuration>

The class:

[XmlType("img")]
public class ImageNameExceptionItemXml 
{ 
    [XmlAttribute("name")]     
    public string Filename; 
}

[XmlType("warn")]
public class WarnExceptionItemXml
{
    [XmlElement("img")]
    public List<ImageNameExceptionItemXml> ImgList { get; set; }
}

[XmlRoot("configuration")]
public class ImageNameExceptionListXml
{
    [XmlElement("img")]
    public List<ImageNameExceptionItemXml> ImgList { get; set; }

    [XmlElement("warn")]
    public WarnExceptionItemXml WarnList { get; set; } 
}

And the deserialize test:

XmlSerializer xml = new XmlSerializer(typeof(ImageNameExceptionListXml));

ImageNameExceptionListXml teste = (ImageNameExceptionListXml)xml.Deserialize(new FileStream("XMLFile1.xml", FileMode.Open));
や莫失莫忘 2025-01-13 04:02:26

XmlSerializer 只允许数组/列表中的一种类型。很好。发布我的测试代码:

[XmlType("img")]
[Serializable]
public class ImageNameExceptionItemXml
{
    [XmlAttribute("name")]
    public string Filename;
}

[XmlType("warn")]
[Serializable]
public class Warnning
{
    [XmlArrayItem(typeof(ImageNameExceptionItemXml))]
    public List<ImageNameExceptionItemXml> imgs { get; set; }
}

[XmlRoot("configuration")]
[Serializable]
public class ImageNameExceptionListXml
{
    [XmlArrayItem(typeof(Warnning))]
    public List<Warnning> warns{ get; set; }

    [XmlArrayItem(typeof(ImageNameExceptionItemXml))]
    public List<ImageNameExceptionItemXml> imgs { get; set; }

}

xml:

<configuration>
<imgs>
    <img name="name1" />
    <img name="name2" />
</imgs>
<warns>
    <warn>
      <imgs>
        <img name="warn2" />
        <img name="warn1" />
      </imgs>
    </warn>
    <warn>
      <imgs>
        <img name="warn3" />
        <img name="warn4" />
      </imgs>
    </warn>
 </warns>
</configuration>

XmlSerializer just allow one type in array/list. is fine. Post My test code:

[XmlType("img")]
[Serializable]
public class ImageNameExceptionItemXml
{
    [XmlAttribute("name")]
    public string Filename;
}

[XmlType("warn")]
[Serializable]
public class Warnning
{
    [XmlArrayItem(typeof(ImageNameExceptionItemXml))]
    public List<ImageNameExceptionItemXml> imgs { get; set; }
}

[XmlRoot("configuration")]
[Serializable]
public class ImageNameExceptionListXml
{
    [XmlArrayItem(typeof(Warnning))]
    public List<Warnning> warns{ get; set; }

    [XmlArrayItem(typeof(ImageNameExceptionItemXml))]
    public List<ImageNameExceptionItemXml> imgs { get; set; }

}

xml:

<configuration>
<imgs>
    <img name="name1" />
    <img name="name2" />
</imgs>
<warns>
    <warn>
      <imgs>
        <img name="warn2" />
        <img name="warn1" />
      </imgs>
    </warn>
    <warn>
      <imgs>
        <img name="warn3" />
        <img name="warn4" />
      </imgs>
    </warn>
 </warns>
</configuration>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文