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

Deserialize into object from not nested xml

像这样对 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; }
}

我试过用 [XmlElement("treffer")] 注释 Medium 属性 因为标签是 <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 类型的对象:

这不是 XmlSerializer 的工作方式。 class 结构 必须 对应 XML 结构才能自动工作。

这个:

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

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

有两个选项可以解决您的问题:

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