具有属性的列表的XML序列化

时间:2012-12-11 01:02:36

标签: c# asp.net xml serialization xml-serialization

我在另一个列表(具有变体的产品)中有一个列表。我希望父列表上设置属性(只有idname)。

所需输出

<embellishments>
    <type id="1" name="bar bar foo">
        <row>
            <id>1</id>
            <name>foo bar</name>
            <cost>10</cost>
        </row>      
    </type> 
</embellishments>

当前代码

[XmlRoot( ElementName = "embellishments", IsNullable = false )]
public class EmbellishmentGroup
{
    [XmlArray(ElementName="type")]
    [XmlArrayItem("row", Type=typeof(Product))]
    public List<Product> List { get; set; }

    public EmbellishmentGroup() {
        List = new List<Product>();
        List.Add( new Product() { Id = 1, Name = "foo bar", Cost = 10m } );
    }
}

public class Product
{
    [XmlElement( "id" )]
    public int Id { get; set; }

    [XmlElement( "name" )]
    public string Name { get; set; }

    [XmlElement( "cost" )]
    public decimal Cost { get; set; }
}

当前输出

<embellishments>
    <type>
        <row>
            <id>1</id>
            <name>foo bar</name>
            <cost>10</cost>
        </row>
    </type>
</embellishments>

1 个答案:

答案 0 :(得分:12)

您需要创建另一个代表type元素的类。然后,您可以为属性添加属性,如下所示:

[XmlRoot(ElementName = "embellishments", IsNullable = false)]
public class EmbellishmentGroup
{
    [XmlElement("type")]
    public MyType Type { get; set; }

    public EmbellishmentGroup() 
    {
        Type = new MyType();
    }
}

public class MyType
{
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("row")]
    public List<Product> List { get; set; }

    public MyType()
    {
        Id = 1;
        Name = "bar bar foo";
        List = new List<Product>();
        Product p = new Product();
        p.Id = 1;
        p.Name = "foo bar";
        p.Cost = 10m;
        List.Add(p);
    }
}

public class Product
{
    [XmlElement( "id" )]
    public int Id { get; set; }

    [XmlElement( "name" )]
    public string Name { get; set; }

    [XmlElement( "cost" )]
    public decimal Cost { get; set; }
}