Modifier le nom de l’élément de tableau xml dans un object WebAPI ASP.NET sérialisé

J’ai du mal à sortir un élément xml racine personnalisé lors du renvoi d’une liste d’objects dans mon contrôleur WebAPI.

Ma méthode de contrôleur ressemble à ceci:

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

qui rend une sortie XML comme ceci:

   Product1   Product2   

J’aimerais changer en mais je n’ai pas trouvé le moyen de le faire.

J’ai essayé différentes variantes des atsortingbuts DataContract et DataMember sans succès.

Est-ce que quelqu’un sait s’il existe un moyen de faire ce que je veux, à moins d’envelopper mon object List dans une nouvelle classe et de le renvoyer à la place?

 class Program { static void Main(ssortingng[] args) { HttpConfiguration config = new HttpConfiguration(); DataContractSerializer productsSerializer = new DataContractSerializer(typeof(List), "Products", Ssortingng.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 ssortingng Name { get; set; } } 

Je sais que vous n’aimez pas beaucoup l’idée du wrapper, mais il existe une solution qui utilise un peu un wrapper mais utilise également les atsortingbuts xml avec lesquels il est très facile de travailler. Mon refus d’utiliser l’approche suivante est l’utilisation de l’ancien sérialiseur.

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

Désormais, votre contrôleur peut simplement renvoyer des produits tels que:

  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}, } }; } 

maintenant, vous pouvez spécifier le sérialiseur au démarrage comme suit:

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

Je sais que ce n’est pas le moyen idéal de spécifier le sérialiseur et de perdre la flexibilité et la commodité d’EF et de Linq. Ou du moins devoir intervenir plutôt que de simplement renvoyer IEnumerable <>.

Je dois donner crédit au site suivant comme je l’ai appris pour la première fois de ce site sur: http://justthisguy.co.uk/outputting-custom-xml-net-web-api/

Cela se traduira par le code XML suivant:

        

S’il vous plaît ne pas oublier de regarder le site répertorié.

Comme dit insaisissable ….

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

Si vous rencontrez des problèmes parce que c’est une méthode, essayez de la redéfinir en tant que propriété, car elle ne prend aucun paramètre et a probablement plus de sens.

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

Cela listera tous les articles du Product contenus dans un élément nommé “Produits”.

   Product1   Product2   

PS Pour renommer les balises d’éléments de Product vous pouvez utiliser l’ [XmlArrayItem("Product")] pour ce faire. Si vous voulez avoir une liste [XmlElement("Product")] pas dans ‘Produits’), vous pouvez utiliser le [XmlElement("Product")] et cela les [XmlElement("Product")] sans les regrouper.

Je suppose que vous utilisez NetDataContractSerializer
Vous pouvez spécifier le nom de l’élément racine dans le constructeur du sérialiseur:

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

Jetez un coup d’œil aux différentes surcharges:

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

J’étais confronté au même problème et j’ai cherché mais je n’ai trouvé aucune solution appropriée. J’ai donc finalement décidé de remplacer la chaîne “ArrayOfProduct” par “Products” et tout se passe bien.

Je sais que c’est une mauvaise façon de faire mais c’est rapide.

Vous devriez être capable d’utiliser l’atsortingbut de sérialisation XML comme décrit ici

Cela fait longtemps que je n’ai pas travaillé avec eux, mais ils ont été rapides et faciles à apprendre.

S’il vous plaît vérifier cela. Il existe des informations sur la configuration de la sortie de la classe au format XML.

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

À mon avis, il ne s’agit pas de l’API wep mais de la configuration de la classe.

Je l’ai fait plusieurs fois, en personnalisant la sortie de sérialisation XML. Utilisation d’atsortingbuts dans mes définitions de classe:

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

cela devrait vous donner la sortie que vous cherchez …