如何使用web api和模型绑定定义xml属性

时间:2013-06-03 11:57:43

标签: asp.net-web-api

我正在创建一个产品的xml Feed,它需要完全匹配客户端方案。

我正在使用网络API。我希望属性extractDate是一个属性。以下代码将extractDate输出为元素而不是属性

    public Feed GetProducts()
    {
             var feed = new Feed()
             {
                 extractDate = "extractDate",
                 incremental = true,
                 name = "name",
                 Brands = GetBrands(),
                 Categories = GetCategories(),
                 Products = GetProducts()
             };


         return feed;
    }

这是我的模型Feed。请注意,以下似乎不会将元素转换为属性

[XmlAttribute(AttributeName = "extractDate")]
public class Feed
{
    [XmlAttribute(AttributeName = "extractDate")] //attribute is ignored
    public string extractDate { get; set; }
    public bool incremental { get; set; }
    public string name { get; set; }
    public List<Brand> Brands { get; set; }
    public List<Category> Categories { get; set; } 
    public List<Product> Products { get; set; } 
}

我如何输出

<feed extractDate="2012/01/01" 

// other logic

/>

3 个答案:

答案 0 :(得分:11)

默认情况下,Web API在XmlMediaTypeFormatter中使用DataContractSerializer,这可能就是您没有看到属性修饰生效的原因。您是否在XmlMediaTypeFormatter上启用了XmlSerializer以查看预期输出?

config.Formatters.XmlFormatter.UseXmlSerializer = true;

另外,您也可以使用以下api为特定类型设置XmlSerializer:

config.Formatters.XmlFormatter.SetSerializer<>

答案 1 :(得分:3)

编辑
管理用空白项目来模拟你的问题,而Kiran的答案似乎就是这样做的。
只需在控制器中添加这一行(出于测试目的,它应该在你的global.asax中)

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

你的班级上有[XmlRoot]还是缺少?
如果没有xml类装饰器,不确定该属性是否可行。 你可以做一个简单的完整性检查是序列化没有web api的类,以确保它没有什么愚蠢但实际上与web api相关。

答案 2 :(得分:0)

这个怎么样:

[XmlRoot("feed")]
public class Feed
{
     [XmlAttribute(AttributeName = "extractDate")]
     public string extractDate { get; set; }

     public bool incremental { get; set; }
     public string name { get; set; }
     public List<Brand> Brands { get; set; }
     public List<Category> Categories { get; set; } 
     public List<Product> Products { get; set; } 
}