2012-04-11 5 views
0

I xml in Variablen bin Parsen wie sowie kann ich Klassenvariablen außerhalb eines Parsing-Anweisung wp7

void myClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
     { 
     if (e.Error == null) 
      { 
       XElement currencyElements = XElement.Parse(e.Result); 

       XNamespace gesmes = "http://www.gesmes.org/xml/2002-08-01"; 
       XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"; 

       usd=Convert.ToDouble(currencyElements.Descendants(ns +"Cube") 
       .Where(x=>x.Attribute("currency")!=null)    
       .Where(x => x.Attribute("currency") 
       .Value == "USD") 
       .Select(x => new ClassRates 
       { 
        usd=Convert.ToDouble(x.Attribute("rate").Value) 
       })); 


      else 
      { 
       textBlock1.Text = e.Error.ToString(); 
      } 
} 

ist hier meine Klasse ClassRates

public class ClassRates 
     { 
      public String curName { get; set; } 
      public double curRate { get; set; } 

      public double usd, jpy, bgn, czk, dkk, 
      gbp, huf, ltl, lvl, pln, ron, sek, chf, nok, 
      hrk, rub, try1, aud, brl, cad, cny, hkd, idr, 
      ils, inr, krw, mxn, myr, nzd, php, sgd, thb, zar; 
     } 

die Variable usd ist nicht verfügbar außerhalb von der Parsing-Block für Berechnungen. Liegt das daran, dass ich Elemente über die Klasse zum Parsen auswähle? Gibt es eine Arbeit? versucht haben, ein Wörterbuch/Liste/Array zu implementieren für Preise, aber auch nicht funktioniert gespeichert werden, hier ist die Version, wo ich versuche, ein Wörterbuch

Dictionary<string, double> rates = new Dictionary<string, double>(); 
       String xml = e.Result; 
       XElement doc = XElement.Parse(xml); 
       XNamespace ns = XNamespace.Get("http://www.gesmes.org/xml/2002-08-01"); 
       XNamespace masterNs = XNamespace.Get("http://www.ecb.int/vocabulary/2002-08-01/eurofxref"); 

       doc.Element(ns.GetName("Envelope")) 
        .Element(masterNs.GetName("Cube")) 
        .Elements(masterNs.GetName("Cube")) 
        .ToList().ForEach(cube => 
        { 

         var cubeCurrencies = cube.Descendants(masterNs.GetName("Cube")); 

         cubeCurrencies.ToList().ForEach(currency => 
         { 
          var country = currency.Attribute("currency").Value; 
          var rate = currency.Attribute("rate").Value; 

          rates.Add(country, double.Parse(rate)); 
         }); 

        }); 

dies führt zu einer Nullreferenceexception zu verwenden, die ich kann‘ t finden. Irgendwelche Gedanken gern gesehen,

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
<gesmes:subject>Reference rates</gesmes:subject> 
<gesmes:Sender> 
    <gesmes:name>European Central Bank</gesmes:name> 
</gesmes:Sender> 
<Cube> 
    <Cube time="2012-04-12"> 
    <Cube currency="USD" rate="1.3153"/> 
    <Cube currency="JPY" rate="106.54"/> 
    <Cube currency="BGN" rate="1.9558"/> 
    <Cube currency="CZK" rate="24.803"/> 
    <Cube currency="DKK" rate="7.4384"/> 
    <Cube currency="GBP" rate="0.82470"/> 
    <Cube currency="HUF" rate="296.90"/> 
    <Cube currency="LTL" rate="3.4528"/> 
    <Cube currency="LVL" rate="0.6989"/> 
    <Cube currency="PLN" rate="4.1802"/> 
    <Cube currency="RON" rate="4.3745"/> 
    <Cube currency="SEK" rate="8.8912"/> 
    <Cube currency="CHF" rate="1.2027"/> 
    <Cube currency="NOK" rate="7.6100"/> 
    <Cube currency="HRK" rate="7.4758"/> 
    <Cube currency="RUB" rate="38.7840"/> 
    <Cube currency="TRY" rate="2.3664"/> 
    <Cube currency="AUD" rate="1.2645"/> 
    <Cube currency="BRL" rate="2.4075"/> 
    <Cube currency="CAD" rate="1.3132"/> 
    <Cube currency="CNY" rate="8.2961"/> 
    <Cube currency="HKD" rate="10.2128"/> 
    <Cube currency="IDR" rate="12055.30"/> 
    <Cube currency="ILS" rate="4.9348"/> 
    <Cube currency="INR" rate="67.8550"/> 
    <Cube currency="KRW" rate="1500.58"/> 
    <Cube currency="MXN" rate="17.2124"/> 
    <Cube currency="MYR" rate="4.0360"/> 
    <Cube currency="NZD" rate="1.6001"/> 
    <Cube currency="PHP" rate="56.176"/> 
    <Cube currency="SGD" rate="1.6507"/> 
    <Cube currency="THB" rate="40.564"/> 
    <Cube currency="ZAR" rate="10.4472"/> 
</Cube> 
</Cube> 
</gesmes:Envelope> 

mh

+1

Dieser Code wird so vermasselt, ich weiß nicht einmal, wo ... Mein Freund beginnen, bitte nicht mich falsch (ich meine nicht respektlos) ich glaube, Sie brauchen Linq zu verstehen vor dem Start Code so schreiben! –

+0

der Parsing-Code? Ich gehe mit Beispielen und Empfehlungen, die ich gesehen habe, nicht viel über MSDN für Linq, wo finde ich Erklärungen, wie man es benutzt? – mhSligo

+0

Passt Ihre XML-Datei direkt zu Ihrem ClassRates-Objekt? Wenn dies der Fall ist, können Sie es möglicherweise direkt mithilfe von XML-Serialisierung oder DataContractSerializer deserialisieren und Ihr Leben vereinfachen. – earthling

Antwort

0

Erstellen Sie eine lokale Instanz von ClassRate im myClient_DownloadStringCompleted und darauf verweisen, anstatt eine neue Instanz auf Linq Abfrage Abschluss zu schaffen.

Refactor bitte auch Ihren Parsing-Code, sowie ClassRates. Trennen Sie die Linq-Anweisungen, erstellen Sie eine Analysemethode, die den Währungstyp als Parameter verwenden kann, und führen Sie anschließend die Abfrage basierend darauf aus.

+0

Entschuldigung für meine Ignoranz, aber ich verstehe nicht, was Sie meinen oder wie Sie es implementieren/referenzieren. ist es wie 'ClassRates rates = new ClassRates();' Entschuldigung wirklich kämpfen, um es zu verstehen – mhSligo

+0

Ja. Verwenden Sie es außerhalb des Bereichs einer Abfrage - setzen Sie es stattdessen in den Stamm des Ereignishandlers. –

+0

Ok, aber ich verstehe nicht, wie es hilft oder wie man die Instanz 'rates' verwendet – mhSligo

0

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer%28v=vs.95%29.aspx

Hier ist ein Beispiel von zwei Möglichkeiten, einen XML-Twitter-Feed deserialisieren. Sie müssen auch Ihre Klassen einrichten und möglicherweise mit den Attributen [DataContract] und [DataMember] schmücken. Ich hoffe, das ist hilfreich für Sie.

Auch wenn Sie die Zeit haben, schauen Sie in json für Ihre Web-Services. Es neigt dazu, eine viel kleinere Grundfläche zu haben, was bedeutet, dass weniger Daten über die Leitung gesendet werden als xml und es leicht deserialisiert wird.

void myClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     var tweets = ReadToObject(e.Result); 
     var tweets2 = ReadToObject2(e.Result); 
    } 

    private static statuses ReadToObject(string xml) 
    { 
     var tweets = new statuses(); 
     using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
     { 
      var ser = new DataContractSerializer(typeof(statuses)); 
      tweets = ser.ReadObject(ms) as statuses; 
     } 
     return tweets; 

    } 

    private static statuses ReadToObject2(string xml) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(statuses)); 
     var tweets = new statuses(); 

     using(var stringReader = new StringReader(xml)) 
     { 
      using (var xmlReader = new XmlTextReader(stringReader)) 
      { 
       tweets = ser.Deserialize(xmlReader) as statuses; 
      } 
     } 
     return tweets; 
    }