2012-11-26 23 views
7

EDIT çalışır: Ben bir şey çalışmakla yestoday soru soruldu anı .. Ben istek üzerine XmlNamespace özelliğini ayarlayın ettik ve o hile yaptı ..RestSharp Deserialize boş özelliklerini döndürür ama xml.deserialize testi

request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Sonraki sorun RestSharp nesnesi özellikleriyle xml atributes tanımaya oluyor

Ama gerçekten neden olarak anlayamıyorum ...


Bu hafta sonu en çok bunun için uğraşıyorum ve işe yaramayacağım.

RestFul webservice (MusicBrainz) yuvarlak bir sarıcı yazmayı deniyorum. Basit bir örnekle test ediyorum: bir sanatçının ayrıntılarını alın ve özel bir Artist nesnesine yerleştirin.

Bir RestClient üzerinde Yürütme yok Tamam biter ama benim nesne özellikleri boş olduğunda .. Ama XmlDeserializer ile deserialization test ederken ObjectProperties dolu (Ama bir öznitelik karşılık mülkler için, ama ben edilir 'Daha sonra ele alacağım'

Yanıtın serileştirilmesi ile nesneyi response.data içine koymak arasında ne olur? Oldukça mümkün o .. ben bu kadar yapıyorum, bir "acemi" hata RestSharp ile ilk adımlardır

Yardım çok takdir ..

Returnded xml geçerli:

<metadata> 
    <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525"> 
     <name>Uriah Heep</name> 
      <sort-name>Uriah Heep</sort-name> 
      <country>GB</country> 
      <life-span> 
       <begin>1970</begin> 
      </life-span> 
    </artist> 
</metadata> 

Benim sınıfı: aşağıdaki kod çıkış özelliklerinde

public class Artist 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public string SortName { get; set; } 
    public string Country { get; set; } 

} 

doldurulur

var output = xml.Deserialize<Artist>(response); 

Ama

var response = client.Execute<T>(request); 

Komple kodu (Ben basitlik uğruna jenerik yönteminde test kodu koyduk)

çağrılırken aynı tepkiyi almıyor:

public T Execute<T>(RestRequest request) where T : new() 
{ 
    var client = new RestClient(); 
    client.BaseUrl = BaseUrl; 
    client.Authenticator = null; 

    //does not fill properties 
    var response = client.Execute<T>(request); 

    if (response.ErrorException != null) 
    { 
     throw response.ErrorException; 
    } 
    var xml = new XmlDeserializer(); 

    //fills properties 
    var output = xml.Deserialize<Artist>(response); 

    return response.Data; 
} 
+1

İlgilendiğim bir çözüm buldum :-) –

+0

@AndersBornholm. Bu projede biraz iş yaptığımdan beri uzun zaman oldu. Ama benim hafızamda "çözüm" kelimesi RestSharp talebinde bir isim alanı açmaktı. Gerçekten çaresizseniz, projeyi kazabilirim ve daha yakından bakarım ... – FasterRaf

+0

Aslında üzerinde çalışmadım. Projem uzun bir süre için. Doğru bir şekilde hatırlarsam restsharp dışındaki bir şeyi kullanarak çözdüm :-) –

cevap

0

Bu yanıtı aldıktan sonrayönteminin, anlaşmasını yapması, isteğin RootElement ve XmlNamespace özelliklerini temel alması ve kopyalarınınXmlDeserializer.

İşte bir kod from RestClient var:

 handler.RootElement = request.RootElement; 
    handler.DateFormat = request.DateFormat; 
    handler.Namespace = request.XmlNamespace; 
    response.Data = handler.Deserialize<T>(raw); 

bir uyumsuzluğunun XmlNamespace ile RestRequest geçerseniz, RestSharp en XmlDeserializer (yani perde arkasında XDocument kullanır) bir nesne özelliklerine tepki XML eşleme mümkün olmayacaktır ve bunun yerine varsayılan/boş değerleri alırsınız.Varsayılan uygulanması için Şimdi

(el XmlDeserializer oluştururken) Bir XmlNamespace set yoksa, deserializer temelde yanıt olarak tüm ad alanlarını yok sayar ve sadece isimleri bütün özelliklerini eşleyen bir otomatik algılama yapacak .

 request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 
:

bakınız kaynak kodu from XmlDeserializer: bu çizgi ile isteğiniz nesne eşleşen bir ad alanına açıkça ayarladıktan sonra XmlNamespace özelliği çalışmaya başladı neden

 // autodetect xml namespace 
    if (!Namespace.HasValue()) 
    { 
     RemoveNamespace(doc); 
    } 

Yukarıdaki hesaba tüm alarak, bu açıktır

Execute yöntem, isim alanını serpiştiriciye kopyaladı ve XML nesnesini uygun şekilde eşleştirdi.

İlgili konular