外部Xml到c#对象,这是最简单的方法

本文关键字:最简单 方法 Xml 对象 外部 | 更新日期: 2023-09-27 18:06:28

我们有一个从外部程序生成的XML,需要读入我们的c#应用程序。

我知道我们可以使用带有[Serializable]标签的c#类将其加载到对象中,但问题是我们已经拥有了比Xml更OO划分的对象。我们不希望有两组对象

我的想法是,我可以用LinqToXml打开文件并填充我们的对象。这样做是可以的,还是真正最好的方法是将[Serializable]标签与XmlElementAttribute和其他标签一起使用到我们的OO模型中?(如果最新的解决方案是好的解决方案,那么我如何将属性放在对象内部的对象中或使用继承?)

编辑:示例

假设我有:

public class Movie {
    public string Name;
    public Actor LeadActor;
}
public class Actor {
    public string Name;
    public DateTime DOB;
}

我想这样序列化Movie

<Movie>
    <Name>Casino Royale</Name>
    <LeadActor>Daniel Craig</LeadActor>
</Movie>

我看到使它工作的唯一方法是修改Movie,使其具有一个LeadActor属性,该属性将连接Actor属性并使两个Actor属性都具有[XmlIgnore]属性。但是,如果我不想更改这些业务对象该怎么办?

外部Xml到c#对象,这是最简单的方法

如果xml数据的结构是已知的(并且不是太复杂),我发现使用xml。Linq是最简单的方法。每个类都包含公共静态方法,用于从xml重构自身。您必须手动完成它,但是如果xml结构不对应于对象结构,这似乎是唯一的方法—这个方法非常简单。
对于您的示例,它将是:

public class Movie {
    public string Name;
    public Actor LeadActor;
    public static Movie FromXml (XElement x)
    {
        Movie m = new Movie();
        m.Name = x.Element("Name").Value;
        m.LeadActor = Actor.FromXml(x.Element("LeadActor"));
        return m;
    }
}
public class Actor {
    public string Name;
    public DateTime DOB;
    public static Actor FromXml (XElement x)
    {
        Actor a = new Actor();
        a.Name = x.Value;
        a.DOB = ... 
        return a;
    }
}

[Serializable]属性启用二进制序列化,而不是Xml序列化。要支持XML序列化,对象必须具有默认构造函数和公共可设置属性。如果您的对象模型满足这一要求,我会考虑使用内置XML序列化——从长远来看,它可以节省时间。

您可以在顶层对象上实现IXmlSerializable来执行一些自定义序列化。

可以使用xslt转换将源xml转换为与对象模型匹配的xml格式,然后直接将转换后的xml反序列化为对象。