ラッパーのアイデアが気に入らないことは承知していますが、ラッパーを多少使用するだけでなく、操作が非常に簡単な xml 属性も使用するソリューションがあります。次のアプローチを使用することを拒否したのは、古いシリアライザーの使用です。
public class Product
{
[XmlAttribute( "id" )]
public int Id
{
get;
set;
}
[XmlAttribute( "name" )]
public string Name
{
get;
set;
}
[XmlAttribute( "quantity" )]
public int Quantity
{
get;
set;
}
}
[XmlRoot( "Products" )]
public class Products
{
[XmlAttribute( "nid" )]
public int Id
{
get;
set;
}
[XmlElement(ElementName = "Product")]
public List<Product> AllProducts { get; set; }
}
これで、コントローラーは次のような Products を返すことができます。
public Products Get()
{
return new Products
{
AllProducts = new List<Product>
{
new Product {Id = 1, Name = "Product1", Quantity = 20},
new Product {Id = 2, Name = "Product2", Quantity = 37},
new Product {Id = 3, Name = "Product3", Quantity = 6},
new Product {Id = 4, Name = "Product4", Quantity = 2},
new Product {Id = 5, Name = "Product5", Quantity = 50},
}
};
}
次のように、起動時にシリアライザーを指定できるようになりました。
var productssXmlFormatter = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
productssXmlFormatter.SetSerializer<Products>( new XmlSerializer( typeof( Products ) ) );
シリアライザーを指定する必要があり、EF と Linq の柔軟性と利便性が失われるという点で、これが最も理想的な方法ではないことはわかっています。または、IEnumerable<> を返すだけでなく、少なくとも介入する必要があります。
次のサイトからこの方法を最初に知ったので、次のサイトの功績を認めなければなりません: http://justthisguy.co.uk/outputting-custom-xml-net-web-api/
これにより、次の xml が生成されます。
<Products nid="0">
<Product id="1" name="Product1" quantity="20"/>
<Product id="2" name="Product2" quantity="37"/>
<Product id="3" name="Product3" quantity="6"/>
<Product id="4" name="Product4" quantity="2"/>
<Product id="5" name="Product5" quantity="50"/>
</Products>
記載されているサイトをご覧になることを忘れないでください。