修改序列化ASP.NET WebAPI对象中的xml数组元素名称

在WebAPI控制器中返回对象列表时,我一直在努力输出自定义的根xml元素。

我的控制器方法看起来像这样:

public List Get() { return repository.GetProducts(); } 

它呈现像这样的xml输出:

   Product1   Product2   

我想将更改为但还没有找到这样做的方法。

我尝试过DataContractDataMember属性的不同变体无济于事。

有没有人知道是否有办法做我想做的事情,而不是将我的List对象包装在一个新类中并返回它?

 class Program { static void Main(string[] args) { HttpConfiguration config = new HttpConfiguration(); DataContractSerializer productsSerializer = new DataContractSerializer(typeof(List), "Products", String.Empty); config.Formatters.XmlFormatter.SetSerializer(typeof(List), productsSerializer); config.Formatters.XmlFormatter.Indent = true; config.Formatters.XmlFormatter.WriteToStreamAsync( typeof(List), new List { new Product { Name = "Product1" }, new Product { Name = "Product2" } }, Console.OpenStandardOutput(), null, null).Wait(); Console.WriteLine(); } } [DataContract(Namespace = "")] public class Product { [DataMember] public string Name { get; set; } } 

我知道你不喜欢包装器的想法,但有一个解决方案有点使用包装器,但也使用非常容易使用的xml属性。 我拒绝使用以下方法是使用旧的序列化程序。

 public class Product { [XmlAttribute( "id" )] public int Id { get; set; } [XmlAttribute( "name" )] public string Name { get; set; } [XmlAttribute( "quantity" )] public int Quantity { get; set; } } [XmlRoot( "Products" )] public class Products { [XmlAttribute( "nid" )] public int Id { get; set; } [XmlElement(ElementName = "Product")] public List AllProducts { get; set; } } 

现在您的控制器可以返回以下产品:

  public Products Get() { return new Products { AllProducts = new List { new Product {Id = 1, Name = "Product1", Quantity = 20}, new Product {Id = 2, Name = "Product2", Quantity = 37}, new Product {Id = 3, Name = "Product3", Quantity = 6}, new Product {Id = 4, Name = "Product4", Quantity = 2}, new Product {Id = 5, Name = "Product5", Quantity = 50}, } }; } 

现在您可以在启动时指定序列化器,如下所示:

  var productssXmlFormatter = GlobalConfiguration.Configuration.Formatters.XmlFormatter; productssXmlFormatter.SetSerializer( new XmlSerializer( typeof( Products ) ) ); 

我知道这不是最理想的方式,因为必须指定序列化器并失去EF和Linq的灵活性和便利性。 或者至少不得不干预而不仅仅是返回IEnumerable <>。

当我第一次从网站上了解到以下网站时,我必须赞扬以下网站: http : //justthisguy.co.uk/outputting-custom-xml-net-web-api/

这将导致以下xml:

        

请不要忘记查看列出的网站。

正如难以捉摸的说……

 [XmlArray("Products")] public List Get() { return repository.GetProducts(); } 

如果您遇到问题,因为它是一个方法,那么尝试将其重新定义为属性,因为它不需要参数,并且可能更有意义。

 [XmlArray("Products")] public List Products { get { return repository.GetProducts(); } } 

这将列出名为“Products”的元素元素中的所有Product项。

   Product1   Product2   

PS要重命名Product item标签,可以使用[XmlArrayItem("Product")]属性执行此操作。 如果你想要一个平面列表(不要将它们包装在“产品”中),你可以使用[XmlElement("Product")]并列出它们而不对它们进行分组。

我想你正在使用NetDataContractSerializer
您可以在序列化程序的构造函数中指定根元素名称:

 NetDataContractSerializer serializer = new NetDataContractSerializer("Products", "Your.Namespace"); 

看看不同的重载:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx

我遇到了同样的问题并进行了搜索,但未找到任何正确的解决方案,所以最终决定用“产品”替换字符串“ArrayOfProduct”并且它工作顺利。

我知道这样做很糟糕,但速度很快。

您应该能够使用此处概述的Xml序列化attirbues

我和他们一起工作已经有一段时间了,但是他们很快就学会了。

请检查一下。 有一些关于如何以xml格式配置类输出的信息。

https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute%28v=vs.110%29.aspx

在我看来,它不是关于wep api而是关于类的配置。

我已经多次这样做,自定义xml序列化输出。 在我的类定义中使用属性:

 [XmlArray("Products")] public List Products { get { return repository.GetProducts(); } } 

这应该得到你正在寻找的输出…