3

属性なしでC#オブジェクトをXMLにマッピングできるC#ライブラリはありますか?

私はいくつかのデータソースを持っていますが、それらはすべて同じ論理構造でスキーマが異なるXMLデータを含んでいます。たとえば、あるXMLには「zip-code」というフィールドがあり、別のXMLには「postal-code」などの属性があります。すべてのXMLソースを単一のC#クラスで逆シリアル化します。

明らかに、異なる「パス」があるため、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 に答える