我正在尝试构建一个非常简单的C#应用程序来下载最新的RUB-USD汇率。 www.cbr.ru提供了一个从中提取信息的Web服务。我首先调用函数来获取最新的汇率日期。然后使用该日期时间进行调用以获得特定日期的汇率。
我能够提取汇率XML并通过StringReader显示它。我使用Pasted XML作为Classes来使用此XML创建一个类。在进行编码时,它似乎正在工作,因为我的速率变量自动提取预期的属性,即rates.Vname,rates.Vcode等...但程序崩溃(通用Windows错误消息 - “NewExchangeRateService已停止工作”)当它进入反序列化步骤。
这就是我所拥有的,有些线条只是我流程的一部分,显然可以忽略......
public Form1()
{
InitializeComponent();
CBR.ru.DailyInfoSoapClient rublesClient = new DailyInfoSoapClient();
DateTime lastRUB = rublesClient.GetLatestDateTime();
MessageBox.Show(lastRUB.ToShortDateString());
var RubRateXml = rublesClient.GetCursOnDateXML(lastRUB);
DataSet RUBrate = rublesClient.GetCursOnDate(lastRUB);
StringReader sr = new StringReader(RUBrate.GetXml());
richTextBox1.Text = sr.ReadToEnd();
XmlSerializer xs = new XmlSerializer(typeof (ValuteDataValuteCursOnDate));
var rates = (ValuteDataValuteCursOnDate) xs.Deserialize(sr);
MessageBox.Show(rates.Vname);
}
XML看起来像:
<ValuteData>
<ValuteCursOnDate>
<Vname>Доллар США</Vname>
<Vnom>1</Vnom>
<Vcurs>53.1088</Vcurs>
<Vcode>840</Vcode>
<VchCode>USD</VchCode>
</ValuteCursOnDate>
</ValuteData>
这将生成以下类:
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class ValuteData
{
private ValuteDataValuteCursOnDate[] valuteCursOnDateField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ValuteCursOnDate")]
public ValuteDataValuteCursOnDate[] ValuteCursOnDate
{
get { return this.valuteCursOnDateField; }
set { this.valuteCursOnDateField = value; }
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ValuteDataValuteCursOnDate
{
private string vnameField;
private ushort vnomField;
private decimal vcursField;
private ushort vcodeField;
private string vchCodeField;
/// <remarks/>
public string Vname
{
get { return this.vnameField; }
set { this.vnameField = value; }
}
/// <remarks/>
public ushort Vnom
{
get { return this.vnomField; }
set { this.vnomField = value; }
}
/// <remarks/>
public decimal Vcurs
{
get { return this.vcursField; }
set { this.vcursField = value; }
}
/// <remarks/>
public ushort Vcode
{
get { return this.vcodeField; }
set { this.vcodeField = value; }
}
/// <remarks/>
public string VchCode
{
get { return this.vchCodeField; }
set { this.vchCodeField = value; }
}
}
我确信这非常简单,我只是对使用反序列化的某个地方产生了误解,所以希望有人可以快速帮助我。如果你想更进一步,我接下来将需要弄清楚如何拉出Vcurs,其中VchCode = USD(这只是XML的一个示例,还包括许多其他费率)
答案 0 :(得分:2)
您致电ReadToEnd
,然后尝试从同一StringReader
反序列化。但是你已经阅读了整个读者。
另外,你应该尝试这样的事情:
public Form1()
{
InitializeComponent();
}
public void LoadData()
{
CBR.ru.DailyInfoSoapClient rublesClient = new DailyInfoSoapClient();
DateTime lastRUB = rublesClient.GetLatestDateTime();
// MessageBox.Show(lastRUB.ToShortDateString());
var RubRateXml = rublesClient.GetCursOnDateXML(lastRUB);
DataSet RUBrate = rublesClient.GetCursOnDate(lastRUB);
string xml = RUBrate.GetXml();
ValuteDataValuteCursOnDate rates;
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xs = new XmlSerializer(typeof (ValuteDataValuteCursOnDate));
rates = (ValuteDataValuteCursOnDate) xs.Deserialize(sr);
}
richTextBox1.Text = xml;
// MessageBox.Show(rates.Vname);
}
var form = new Form1();
try
{
form.LoadData();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
throw;
}