外部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数据的结构是已知的(并且不是太复杂),我发现使用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反序列化为对象。