2013-09-23 16 views
6

Dinamik olarak oluşturulmuş özellik çantasını döndüren bir Web API web hizmeti yazıyorum. Dinamik bir XML ya da serileştirme yöntemi var mı? İyi öneriler aramaya çalıştım, ancak kullanılabilir bir şey bulamadım.Web API - Dinamik XML seri hale getirme

cevap

18

Özel bir XML biçimlendirici oluşturarak çözdük.

Bu ideal bir çözüm değil ama işe yarıyor. Global.asax

GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter()); 
GlobalConfiguration.Configuration.Formatters 
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

yılında

fantastik bir cevap CustomXmlFormatter

using System; 
using System.IO; 
using System.Net.Http.Formatting; 
using System.Net.Http.Headers; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 

namespace EMP.WebServices.api.Formatters 
{ 
    public class CustomXmlFormatter : MediaTypeFormatter 
    { 
     public CustomXmlFormatter() 
     { 
      SupportedMediaTypes.Add(
       new MediaTypeHeaderValue("application/xml")); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml")); 
     } 

     public override bool CanReadType(Type type) 
     { 
      if (type == (Type)null) 
       throw new ArgumentNullException("type"); 

      return true; 
     } 

     public override bool CanWriteType(Type type) 
     { 
      return true; 
     } 

     public override Task WriteToStreamAsync(Type type, object value, 
      Stream writeStream, System.Net.Http.HttpContent content, 
      System.Net.TransportContext transportContext) 
     { 
      return Task.Factory.StartNew(() => 
       { 
         var json = JsonConvert.SerializeObject(value); 

         var xml = JsonConvert 
          .DeserializeXmlNode("{\"Root\":" + json + "}", ""); 

         xml.Save(writeStream); 
       }); 
     } 
    } 
} 
+3

denilen yeni bir sınıf oluşturun. Bu, eğer Newtonsoft Json dönüştürücüyü kullanıyorsanız, her zaman her iki formatta da aynı verilere sahip olacaksınız - tüm modellerinizi işaretlemeniz gerekmeyecektir. –

+1

CustomXmlFormatter'a bir JsonMediaTypeFormatter parametresi eklemeyi öneririm. Sonra SerializeObject çağırdığınızda, JsonMediaTypeFormatter.SerializerSettings iletin. Bu, hem JSON hem de XML oluşturmak için aynı ayarları kullandığınızdan emin olacaktır. – Brian

+0

Benim için bu, yukarıda bahsettiğimiz konuya çok zarif bir çözüm: Ben JSON ayarları özelleştirmelerimin XML ortam tipine taşınmasını istedim; Bu yaklaşımı paylaştığınız için teşekkürler, @Jakub! FWIW, cevabı, sonuçta "dizi" türündeki hesaplarla sona erdiğim uygulama ile düzenledim ve XML'in serileştirilebilme yeteneğini açıkladı. –