从非嵌套的xml反序列化为对象

时间:2018-01-23 12:49:40

标签: c# .net xml xmlserializer

像这样对XML文件进行映像:

<?xml version="1.0" encoding="UTF-16"?>
<treffer>
    <prod_internid>123456789</prod_internid>
    <md_nr>123123</md_nr>
    <md_mart_id>4</md_mart_id>
    <md_mtyp_nr>9876</md_mtyp_nr>
    <mra_th>
        <ie_th_pth>-1</ie_th_pth>
        <ie_th_ea_bez>Fehler: Keine Angabe</ie_th_ea_bez>
    </mra_th>
</treffer>

如您所见,<md_XY></md_XY>有三个标签。 我想将它们反序列化为一个看起来像这样的对象:

public class DeMedienXmlDto
{
    [XmlElement("md_nr")]
    public int MedienNr { get; set; }

    [XmlElement("md_mart_id")]
    public int MedienArtId { get; set; }

    [XmlElement("md_mtyp_nr")]
    public string MedienTypId { get; set; }
}

但这应该是整个反序列化对象的属性:

[XmlRoot("treffer")]
public class DeAnalyseArtikelXmlDto
{
    [XmlElement("prod_internid")]
    public long ArtikelId { get; set; }

    [XmlElement("treffer")]
    public DeMedienXmlDto Medium { get; set; }

    [XmlElement("mra_th")]
    public List<DeThemenXmlDto> Themen { get; set; }
}

我尝试使用Medium[XmlElement("treffer")]属性进行注释,因为这些代码是<treffer>的子代,但是没有用...

反序列化<mra_th>...</mra_th>,因为我可以使用分组标记对列表进行注释,但我没有<md...>这样的标记。

  • 我怎样才能做到这一点?

我的xml反序列化器如下所示:

public class XmlDeserializer : IXmlDeserializer
{
    public T Deserialize<T>(string xmlFilename)
    {
        var returnObject = default(T);
        if (string.IsNullOrEmpty(xmlFilename)) return default(T);

        try
        {
            var xmlStream = new StreamReader(xmlFilename);
            var serializer = new XmlSerializer(typeof(T));
            returnObject = (T)serializer.Deserialize(xmlStream);
        }
        catch (Exception exception) {
            LogHelper.LogError($"Das XML-File {xmlFilename} konnte nicht deserialisiert werden: {exception.Message}");
            throw;
        }
        return returnObject;
    }
}

提前致谢

修改(澄清):

我希望将以下标记反序列化为DeMedienXmlDto类型的对象:

  • <md_nr>
  • <md_mart_id>
  • <md_mtyp_nr>

1 个答案:

答案 0 :(得分:1)

这不是XmlSerializer的工作原理。类结构必须对应于XML的结构才能自动工作。

此:

[XmlElement("treffer")]
public DeMedienXmlDto Medium { get; set; }

不起作用,因为没有嵌套 <treffer>元素。 XmlElementAttribute不能表示父(周围)元素。

如何解决您的情况有两种选择:

  1. 使用一组单独的类进行反序列化,以及一个表示DTO对象的单独集。然后,您需要创建映射。
  2. DeAnalyseArtikelXmlDto上实施IXmlSerializable并自行解析内部XML。