2013-02-01 80 views
2

是否有C#库允许将C#对象映射到不带属性的XML?将XML映射到C#中没有属性的对象

我有几个数据源,它们都包含具有相同逻辑结构但不同模式的XML数据。例如,在一个XML中可能有一个名为'zip-code'的字段,另一个这个数据将被称为'邮政编码'等属性。我想反序列化单个C#类中的所有XML源。

显然我不能使用XMLAttrubtes,因为有不同的'路径'。我想要类似EclipseLink MOXy(元数据是用XML指定的),但是对于C#。

回答

3

XmlSerializer允许您在运行时动态指定attribute overrides。让我们假设你有以下静态类:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

和下面的XML:

<?xml version="1.0" encoding="utf-8" ?> 
<foo bar="baz" /> 

,你可以在运行时动态添加映射不使用你的模型类的任何静态属性。就像这样:

using System; 
using System.Xml; 
using System.Xml.Serialization; 

public class Foo 
{ 
    public string Bar { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var overrides = new XmlAttributeOverrides(); 
     overrides.Add(typeof(Foo), new XmlAttributes { XmlRoot = new XmlRootAttribute("foo") }); 
     overrides.Add(typeof(Foo), "Bar", new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("bar") }); 
     var serializer = new XmlSerializer(typeof(Foo), overrides); 
     using (var reader = XmlReader.Create("test.xml")) 
     { 
      var foo = (Foo)serializer.Deserialize(reader); 
      Console.WriteLine(foo.Bar); 
     } 
    } 
} 

现在,所有剩下的你是编写可能读取XML文件,其中包含了属性覆盖,并在运行时,你会喂到XmlSerializer从它建立的XmlAttributeOverrides实例一些自定义代码构造函数。

+1

有一点值得一提的是,当使用'XmlAttributeOverrides'时,用户应该花费很多精力来存储和重新使用'XmlSerializer'实例,以防止装配出血。 –

+0

@ darin-dimitrov,根据[MSDN](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx)XmlSerializer类的实例是线程安全的。这意味着您只需为每个XmlAttributeOverrides创建一个XmlSerializer的单例,然后即使在并行线程中也可以使用序列化来实现应用程序生命周期,不是吗? – DarkWalker

+1

@DarkWalker,确实如此。 –