3

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

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

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

4

1 回答 1

4

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构造函数。

于 2013-02-01T07:44:05.613 回答