【问题标题】:External Xml to C# Object, what is the easiest way?外部 Xml 到 C# 对象,最简单的方法是什么?
【发布时间】:2011-08-24 14:28:01
【问题描述】:

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

我知道我们可以使用带有[Serializable] 标签的 C# 类来加载到对象中,但问题是我们已经有了我们的对象,它实际上比 Xml 更加面向对象。我们不希望有 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] 属性。但是如果我不想更改那些业务对象怎么办?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但是,如果一个 XML 节点包含一个属性,该属性实际上是在对象模型中的一个对象中,该属性位于主对象内部的对象中。我没有看到任何可以将属性值转换为“父”xml 属性的 XML 标记:S
      【解决方案3】:

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

      【讨论】:

      • 但是这样如果我需要序列化成不同的格式,比如 JSON 等,它不会在对象内部产生噪音吗? (我知道主要问题中没有具体说明,但我很好奇你的)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 2013-02-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        相关资源
        最近更新 更多