【问题标题】:XML mapping to objects without attributes in C#XML映射到C#中没有属性的对象
【发布时间】:2013-01-16 11:46:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# xml serialization metadata deserialization


    【解决方案1】:

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

    【讨论】:

    • 值得一提的是,在使用XmlAttributeOverrides时,用户要花很多精力来存储和重复使用XmlSerializer实例,以防止组装出血。
    • @darin-dimitrov,根据MSDN XmlSerializer 类的实例是线程安全的。这意味着您只需要为每个 XmlAttributeOverrides 创建一个 XmlSerializer 单例,然后即使在并行线程中使用序列化来保证应用程序的生命周期,不是吗?
    • @DarkWalker,是的,没错。
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-06-05
    • 2017-03-16
    • 2012-04-27
    相关资源
    最近更新 更多