6

我正在创建一个需要与客户方案完全匹配的产品的 xml 提要。

我正在使用网络 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

/>
4

3 回答 3

11

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

config.Formatters.XmlFormatter.UseXmlSerializer = true;

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

config.Formatters.XmlFormatter.SetSerializer<>

于 2013-06-03T17:29:26.080 回答
3

编辑
托管以使用空白项目模拟您的问题,而 Kiran 的答案似乎可以解决问题。
只需在您的控制器中添加这一行(出于测试目的,它可能应该在您的 global.asax 中)

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

您的班级顶部是否有 [XmlRoot] 还是缺少?
不确定该属性是否可以在没有 xml 类装饰器的情况下工作。
您可以做的一个简单的健全性检查是在不涉及 web api 的情况下序列化类,以确保它不是愚蠢的,而是实际上与 web api 相关。

于 2013-06-03T13:27:26.137 回答
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; } 
}
于 2013-06-03T15:17:38.580 回答