XML映射到C#中没有属性的对象

时间:2013-02-01 07:32:41

标签: c# xml serialization metadata deserialization

是否有一个C#库允许将C#对象映射到没有Attributes的XML?

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

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

1 个答案:

答案 0 :(得分: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文件,并在运行时从中构建XmlAttributeOverrides的实例,并将其提供给XmlSerializer构造