外部Xml到C#对象,最简单的方法是什么?

时间:2011-08-24 14:28:01

标签: c# .net xml c#-4.0 .net-4.0

我们从外部程序生成的XML需要读入我们的C#应用​​程序。

我知道我们可以使用带有[Serializable]标记的C#类来加载对象,但问题是我们已经拥有了比Xml更加OO的对象。我们不希望有2组对象。

我的意思是我可以用LinqToXml打开文件并填满我们的对象。这样做是否可以,或者最好的方法是将[Serializable]标签与XmlElementAttribute和其他标签一起用于我们的OO模型? (如果最新的是一个很好的解决方案,我如何将一个属性放在我的对象中的对象中或使用继承?)。

编辑:示例

我要说:

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

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

我想像这样序列化电影:

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

我认为使其工作的唯一方法是修改Movie以具有LeadActor属性,该属性将连接Actor属性并使两个Actor属性与[XmlIgnore]属性一起使用。但是,如果我不想改变这些业务对象呢?

4 个答案:

答案 0 :(得分:2)

如果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;
    }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以在顶级对象上实现IXmlSerializable来进行自定义序列化。

答案 3 :(得分:0)

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