【问题标题】:Deserialize into object from not nested xml从非嵌套的 xml 反序列化为对象
【发布时间】:2018-01-23 12:49:39
【问题描述】:

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

如您所见,&lt;md_XY&gt;&lt;/md_XY&gt; 有三个标签。 我想将它们反序列化为如下所示的对象:

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 属性,因为标签是 &lt;treffer&gt; 的子标签,但这不起作用...

反序列化&lt;mra_th&gt;...&lt;/mra_th&gt; 可以工作,因为我可以使用分组标记对列表进行注释,但我没有&lt;md...&gt; 的此类标记。

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

我的 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 类型的对象:

  • &lt;md_nr&gt;
  • &lt;md_mart_id&gt;
  • &lt;md_mtyp_nr&gt;

【问题讨论】:

  • 正如@Ondrej Tucny 指出的那样,您不能直接反序列化为您描述的对象结构,并且需要序列化为与 xml 匹配的对象结构。然后,您可以以任何您喜欢的方式操作您的“treffer”对象。如果您选择将不同的元素放入不同的对象中使用,请记住您还需要反转该过程并将它们放回“treffer”中,然后再序列化 xml。

标签: c# .net xml xmlserializer


【解决方案1】:

XmlSerializer 不是这样工作的。类结构必须与 XML 的结构相对应,才能自动工作。

这个:

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

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

有两种方法可以解决您的情况:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多