我正在创建一个产品的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
/>
答案 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; }
}