2012-10-24 45 views
11

我从标准MVC 4 WebApi项目获得以下响应;删除<ArrayOf。从MVC Web Api响应

<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> 

我试图让这个返回

<Products> 
<Product> 
<Id>1</Id> 
<Name>Tomato Soup</Name> 
<Category>Groceries</Category> 
<Price>1</Price> 
</Product> 
</Products> 

我发现有很多参考的各种方法,理应解决这个问题,没有工作;

更改默认序列化程序不起作用。

Product创建客户序列化程序不起作用。

使用合适的XmlRoot和XmlElement属性创建具有List<Product>的新类不起作用。

添加Datacontract属性不起作用。

添加CollectionDatacontract属性不起作用。

这似乎对其他人都很简单,除了我!

+0

您是否尝试过使用设置[在这太问题和答案显示(HTTP ://stackoverflow.com/questions/12263345/asp-net-web-api-xml-serialization-arrayof)。另外,您是否使用Web API的发行版? –

+0

是的,试过了,是的,它是发布版本。 – ChrisBint

回答

14

尝试使用XmlSeriazlier代替:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

然后尝试定义,从产品的集合派生类,并使用[XmlRoot(“产品”)重命名从“ArrayOfProduct”元素名称到'产品'。

例如,而不是使用列表,使用类产品:

[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的行动:

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

嗨。有没有办法去做你做的,但也改变'Product' xml元素到别的东西?我无法找到一种方法来设置类的正确属性来更改名称... – Tallmaris

+0

2调用:使用[DataContract]属性来装饰类或/和属性 – Romko

+0

代码中的“config”是什么?你的意思是'GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;'? –