0

我正在将 xml 解析成这样的变量

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();
            }
}

这是我的班级 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;
        }

该变量usd在解析块之外不可用于计算。这是因为我正在通过类选择项目进行解析吗?有解决办法吗?试图实现一个字典/列表/数组来存储费率但也不起作用,这是我尝试使用字典的版本

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

                   });

这会导致我找不到 NullReferenceException。欢迎任何想法,

    <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>

小时

4

2 回答 2

0

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

这是反序列化 xml twitter 提要的两种方法的示例。您还需要设置您的类,并可能使用[DataContract][DataMember]属性来装饰它们。

此外,如果您有时间,请为您的 Web 服务查看 json。它的占用空间往往要小得多,这意味着通过线路发送的数据比 xml 少,而且它很容易反序列化。

    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;
    }
于 2012-04-12T18:43:57.177 回答
0

ClassRate在 中创建一个本地实例myClient_DownloadStringCompleted并引用它,而不是在 Linq 查询完成时创建一个新实例。

另外,请重构您的解析代码,以及ClassRates. 将Linq语句分开,创建一个可以将货币类型作为参数的解析方法,然后根据它进行查询。

于 2012-04-11T21:50:48.207 回答