是否有允许将 C# 对象映射到没有属性的 XML 的 C# 库?
我有几个数据源,它们都包含具有相同逻辑结构但模式不同的 XML 数据。例如,在一个 XML 中可能有一个名为“zip-code”的字段,在另一个 XML 中,此数据将位于名为“postal-code”的属性中等。我想在单个 C# 类中反序列化所有 XML 源。
显然我不能使用 XMLAttrubtes,因为有不同的“路径”。我想要EclipseLink MOXy 之类的东西(元数据在 XML 中指定),但是对于 C#。
是否有允许将 C# 对象映射到没有属性的 XML 的 C# 库?
我有几个数据源,它们都包含具有相同逻辑结构但模式不同的 XML 数据。例如,在一个 XML 中可能有一个名为“zip-code”的字段,在另一个 XML 中,此数据将位于名为“postal-code”的属性中等。我想在单个 C# 类中反序列化所有 XML 源。
显然我不能使用 XMLAttrubtes,因为有不同的“路径”。我想要EclipseLink MOXy 之类的东西(元数据在 XML 中指定),但是对于 C#。
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
构造函数。