2010-11-02 8 views
9

Ich habe eine XML-ähnlicheWie kann ich Xml-Liste mit Restsharp deserialisieren?

<?xml version="1.0" encoding="utf-8"?> 
    <xml> 
      <item> 
        <accountid>1</accountid> 
        <accounttypeid>1</accounttypeid> 
        <accounttypename/> 
        <accountbankid>1</accountbankid> 
        <accountbankname/> 
        <accountsaldo>0</accountsaldo> 
      </item> 
      <item> 
        <accountid>2</accountid> 
        <accounttypeid>1</accounttypeid> 
        <accounttypename/> 
        <accountbankid>2</accountbankid> 
        <accountbankname/> 
        <accountsaldo>0</accountsaldo> 
      </item> 
      ... 
    </xml> 

ich diese XML-Liste zu POCO Objekt deserialisieren möchten das ist

public class Account 
{ 
     public string AccountId { get; set; } 
     public string AccountTypeId { get; set; } 
     public string AccountTypeName { get; set; } 
     public string AccountBankId { get; set; } 
     public string AccountBankName { get; set; } 
     public string AccountSaldo { get; set; } 
} 

ich großes Produkt RestSharp für die Arbeit mit Rest-Client gefunden. Ich möchte seinen Deserializer verwenden und habe zwei Ansätze versucht.

1) habe ich versucht,

request.RootElement = "item";

var response = Execute<Account>(request);

und ich habe nur das erste Element Element, das ist logisch.

2) Wenn ich versuche, so etwas wie

request.RootElement = "xml";

var response = Execute<List<Account>>(request);

ich null bekam.

Wo liege ich falsch damit?

UPDATE: Die Lösung in akzeptierte Antwort ist

Antwort

8

Es sollte funktionieren, wenn Sie die Klasse Account zu Item umbenennen und Execute<List<Item>>(request) verwenden. Sie müssen keinen RootElement-Wert angeben.

+0

Hmm, ich habe ErrorMessage = "Index war außerhalb der Grenzen des Arrays." – nemke

+0

Funktioniert es, wenn Sie 'RootElement =" xml ";'? Ich dachte, es funktioniert ohne das, aber vielleicht erinnere ich mich falsch. –

+0

und wenn das nicht funktioniert, versuchen Sie, RootElement zu setzen und die Klasse 'item' zu benennen –

6

Nicht sicher kommentiert, was los ist, aber ich bin sicher, dass John von bald werden Sie :-) In der Zwischenzeit wissen zu lassen, warum es nicht nur Der manuelle Weg:

var root = XElement.Parse(xmlString); 
    var accounts = from it in root.Element("xml").Elements("item") 
        select new Account() { 
              AccountId = it.Element("accountid").Value, 
              AccountTypeId = it.Element("accounttypeid").Value, 
              AccountTypeName = it.Element("accounttypename").Value, 
              AccountBankId = it.Element("banktypeid").Value, 
              AccountBankName = it.Element("banktypename").Value, 
              AccountSaldo = it.Element("accountsaldo").Value 
             }; 

Es ist so sauber und einfach mit XLinq. Indem Sie XElement ein paar Erweiterungsmethoden hinzufügen, können Sie es noch sauberer und widerstandsfähiger gegen fehlende Elemente/Attribute machen.

+0

Ja, mir geht es mit linq2xml gut, aber ich wollte Client API für die schnelle Entwicklung erstellen, ohne die Notwendigkeit einer manuellen Codierung. Ich brauche eine funktionierende Vertikale, um meinen Kollegen zu zeigen. 10x für die Antwort sowieso! – nemke

Verwandte Themen