【问题标题】:Deserialize XML list of elements of string element each反序列化每个字符串元素的 XML 列表
【发布时间】:2019-02-25 08:13:36
【问题描述】:

我无法使用 C# 反序列化 XML 的以下部分

<mainfile>
    <portfolio>
        <fotos>
            <foto> <!CDATA[https://whatever.com/fotos/E/400/photo.JPG]]>
            </foto>
        </fotos>
    </portfolio>
    <portfolio>
        <fotos>
            <foto> <!CDATA[https://whatever.com/fotos/E/400/photo1.JPG]]>
            </foto>
        </fotos>
    </portfolio>
</mainfile>

我认为它应该很简单,但是在反序列化时它总是返回一个空列表。代码如下:

[XmlRoot("mainfile")]
public class MainFile
{
    public MainFile()
    {
        porftolios= new List<Portfolio>();
    }

    [XmlElement("portfolio")]
    public List<Portfolio> Portfolios{ get; set; }
}

public class Portfolio
{
    ....
    [XmlElement("fotos")]
    public List<Foto> Fotos { get; set; }
}

public class Foto
{
    [XmlText]
    public string data{ get; set; }
}

谢谢。

编辑。 从 HimBromBeere 的解决方案中,我更改了以下代码,结果成功:

public class Portfolio
{
    ....
    [XmlArray("fotos")]
    [XmlArrayItem("foto")]
    public List<Foto> Fotos { get; set; }
}

public class Foto
{
    [XmlText]
    public string data{ get; set; }
}

【问题讨论】:

  • 如何(以及在​​何处)反序列化 xml?
  • 我添加了一个包含更多信息和代码的“编辑”部分。感谢您的帮助!

标签: c# xml serialization


【解决方案1】:

当将XmlElement 用于列表类型时,生成的 xml 中的容器列表元素会丢失。当您确实为您的 fotos-tag 提供了该容器时,您应该使用 XmlArrayItem 来表示它:

public class Portfolio
{
    [XmlArray("fotos")]
    [XmlArrayItem("foto")]
    public List<Foto> Fotos { get; set; }
}

如果您可以更改 xml,但我建议您为您的收藏使用一致的样式,也可以为您的 portfolio 使用容器,或者为您的 fotos 省略它。

【讨论】:

  • 感谢您的回复。我不确定通过使用“投资组合”容器来理解您的意思。我已经更新了 XML,因此您可以看到一个“主文件”中有许多“组合”。无论如何,您的解决方案仍然对我不起作用,我仍然得到一个空的“照片”列表。
  • @MorgoZ 通过容器,我的意思是在 fotos-tag 中还有一个嵌套的 foto-tag,与没有被投资组合包围的投资组合标签形成对比
  • @MorgoZ 也许问题与 cdata 部分有关?当你用“MyString”之类的东西替换那个文本时会发生什么?
  • 是的,你是对的!那就是问题所在。删除 CDATA 标记会正确返回文本。但是我怎么能设法从 CDATA 中获取文本呢?正如我在这个 stackoverflow 问题中检查的那样:stackoverflow.com/questions/397085/… 是否使用 CDATA 应该是透明的......
  • 好吧,忘了最后一个。现在工作完美......有和没有CDATA......不要知道我做错了什么。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多