Remove <ArrayOf. From MVC Web Api response

asp.net-mvc, asp.net-mvc-4, asp.net-web-api, xml

Solution

Try using the XmlSeriazlier instead:

config.Formatters.XmlFormatter.UseXmlSerializer = true;

And then try defining a class that derives from the collection of Product, and use [XmlRoot("Products")] to rename the element name from 'ArrayOfProduct' to 'Products'.

For example, instead of using List, use the class Products:

[XmlRoot("Products")]
public class Products : List<Product> { }

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public double Price { get; set; }
}

ApiController's action:

    public Products Get()
    {
        return new Products()
        {
            new Product() 
            {
                Id = 1,
                Name = "Tomato Soup", 
                Category = "Groceries",
                Price = 1
            }
        };
    }

Problem

I am getting the following response from a standard MVC 4 WebApi project; ``` <ArrayOfProduct xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Product> <Id>1</Id> <Name>Tomato Soup</Name> <Category>Groceries</Category> <Price>1</Price> </Product> </ArrayOfProduct> ``` I am trying to make it so that it returns ``` <Products> <Product> <Id>1</Id> <Name>Tomato Soup</Name> <Category>Groceries</Category> <Price>1</Price> </Product> </Products> ``` I have found many reference to various methods that supposedly solve this, none work; Changing the default serializer does not work. Creating a customer serializer for `Product` does not work. Creating a new class that has `List<Product>` exposed with suitable XmlRoot and XmlElement attributes does not work. Adding `Datacontract` attributes does not work. Adding `CollectionDatacontract` attributes does not work. This appears to be so simple to everyone else, except me!

Original source

Related problems