2

この行動を避けようとしている人々をオンラインで見つけることができるようですが、私が望む行動を得ることができないようです.

私は動物のリストを持っていて、動物の種類ごとに異なるタグでそれらをシリアル化したいです (アタッチ属性を持つデフォルトの動作とは対照的に)

この動作を実現するために、次のコードを使用しています

    [XmlElementAttribute(Order = 4)]
    [XmlElement("Frog", typeof(Frog))]
    [XmlElement("Cat", typeof(Cat))]
    [XmlElement("Dog", typeof(Dog))]
    public List<Animal> lines = new List<Animal>();

リストを平坦化することを除いて、これはうまく機能します.xml出力がタグが保持され<animals> <Dog>Bob</Dog> <Cat>Fred</Cat> <Dog>Mike</Dog> </animals> たものに似ている場合は、それを好むでしょう <animals>

4

2 に答える 2

2

を変更[XmlElementAttribute(Order = 4)]します[XmlArrayAttribute(Order=4)]

属性にパラメーターを指定することもできElementNameます。これはルート名になります。つまり、次のようになります。[XmlArrayAttribute(Order=4, ElementName="animals")]

*注: Order=4 は、このケースに固有のものです。通常は必要ありません。*

編集:(OPコメントに感謝):

次のように、リストに属するオブジェクトのクラスの属性[XmlElement][XmlArrayItem] (MSDN doc here)に変更する必要もあります。

[XmlArrayItem("Frog", typeof(Frog))]
[XmlArrayItem("Cat", typeof(Cat))]
[XmlArrayItem("Dog", typeof(Dog))]
于 2012-05-09T23:25:47.120 に答える
0

リストはいつでも独自のクラスでラップでき、期待どおりの XML を取得できます。

public class StackOverflow_10524470
{
    public class Animal
    {
        [XmlText]
        public string Name { get; set; }
    }
    public class Dog : Animal { }
    public class Cat : Animal { }
    public class Frog : Animal { }
    public class Root
    {
        [XmlElementAttribute(Order = 4, ElementName = "animals")]
        public Animals animals;
    }
    public class Animals
    {
        [XmlElementAttribute(Order = 4)]
        [XmlElement("Frog", typeof(Frog))]
        [XmlElement("Cat", typeof(Cat))]
        [XmlElement("Dog", typeof(Dog))]
        public List<Animal> lines = new List<Animal>();
    }
    public static void Test()
    {
        MemoryStream ms = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(typeof(Root));
        Root root = new Root
        {
            animals = new Animals
            {
                lines = new List<Animal> 
                { 
                    new Dog { Name = "Fido" },
                    new Cat { Name = "Fluffy" },
                    new Frog { Name = "Singer" },
                }
            }
        };
        xs.Serialize(ms, root);
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }
}
于 2012-05-09T22:03:41.307 に答える