如何使用C#从xml api数据中获取第二个出现的名称

时间:2017-03-28 06:27:03

标签: c# xml winforms api

我试图从this api抓住高点和低点,我能够获得高点,但无法弄清楚要做什么来获得低点,这是第二个发生了一个名为" fahrenheit"的项目,我怎么能用我用来获得High的相同方法呢?

if (xmlForecast.Name == "fahrenheit" && i == 0)
{
   i++;
   xmlHigh = xmlForecast.ReadString();
}

1 个答案:

答案 0 :(得分:1)

由于您需要使用XML响应的解决方案,因此它是:

首先,您需要创建代表XML响应的类。

1 2 3
1 2 3
2 1 4 5
3 1
4 2 1
5 2

其次,您需要将XML反序列化为[XmlRoot("response")] public class Response { [XmlElement("version")] public string Version { get; set; } [XmlElement("termsofService")] public string TermsOfService { get; set; } [XmlElement("features")] public Features Features { get; set; } [XmlElement("forecast")] public Forecast Forecast { get; set; } } public class Features { [XmlElement("forecast")] public int Forecast { get; set; } } public class Forecast { [XmlElement("txt_forecast")] public TxtForecast TxtForecast { get; set; } [XmlElement("simpleforecast")] public SimpleForecast SimpleForecast { get; set; } } public class TxtForecast { [XmlElement("date")] public string Date { get; set; } [XmlArray("forecastdays")] [XmlArrayItem("forecastday")] public List<ForecastDay> ForecastDays { get; set; } } public class ForecastDay { [XmlElement("period")] public int Period { get; set; } [XmlElement("icon")] public string Icon { get; set; } [XmlElement("icon_url")] public string IconUrl { get; set; } [XmlElement("title")] public string Title { get; set; } [XmlElement("fcttext")] public string FctText { get; set; } [XmlElement("fcttext_metric")] public string FctTextMetric { get; set; } [XmlElement("pop")] public string Pop { get; set; } } public class SimpleForecast { [XmlArray("forecastdays")] [XmlArrayItem("forecastday")] public List<ForecastDay2> ForecastDays { get; set; } } public class ForecastDay2 { [XmlElement("date")] public Date Date { get; set; } [XmlElement("period")] public int Period { get; set; } [XmlElement("high")] public High High { get; set; } [XmlElement("low")] public Low Low { get; set; } [XmlElement("conditions")] public string Conditions { get; set; } [XmlElement("icon")] public string Icon { get; set; } [XmlElement("icon_url")] public string IconUrl { get; set; } [XmlElement("skyicon")] public string SkyIcon { get; set; } [XmlElement("pop")] public int Pop { get; set; } [XmlElement("qpf_allday")] public QpfAllday QpfAllDay { get; set; } [XmlElement("qpf_day")] public QpfDay QpfDay { get; set; } [XmlElement("qpf_night")] public QpfNight QpfNight { get; set; } [XmlElement("snow_allday")] public SnowAllday SnowAllday { get; set; } [XmlElement("snow_day")] public SnowDay SnowDay { get; set; } [XmlElement("snow_night")] public SnowNight SnowNight { get; set; } [XmlElement("maxwind")] public MaxWind MaxWind { get; set; } [XmlElement("avewind")] public AveWind AveWind { get; set; } [XmlElement("avehumidity")] public int AveHumidity { get; set; } [XmlElement("maxhumidity")] public int MaxHumidity { get; set; } [XmlElement("minhumidity")] public int MinHumidity { get; set; } } public class Date { [XmlElement("epoch")] public string Epoch { get; set; } [XmlElement("pretty")] public string Pretty { get; set; } [XmlElement("day")] public int Day { get; set; } [XmlElement("month")] public int Month { get; set; } [XmlElement("year")] public int Year { get; set; } [XmlElement("yday")] public int Yesterday { get; set; } [XmlElement("hour")] public int Hour { get; set; } [XmlElement("min")] public string Min { get; set; } [XmlElement("sec")] public int Sec { get; set; } [XmlElement("isdst")] public string Isdst { get; set; } [XmlElement("monthname")] public string MonthName { get; set; } [XmlElement("monthname_short")] public string MonthNameShort { get; set; } [XmlElement("weekday_short")] public string WeekdayShort { get; set; } [XmlElement("weekday")] public string Weekday { get; set; } [XmlElement("ampm")] public string AmPM { get; set; } [XmlElement("tz_short")] public string TzShort { get; set; } [XmlElement("tz_long")] public string TzLong { get; set; } } public class High { [XmlElement("fahrenheit")] public string Fahrenheit { get; set; } [XmlElement("celsius")] public string Celsius { get; set; } } public class Low { [XmlElement("fahrenheit")] public string Fahrenheit { get; set; } [XmlElement("celsius")] public string Celsius { get; set; } } public class QpfAllday { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("mm")] public int Milimeters { get; set; } } public class QpfDay { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("mm")] public int Milimeters { get; set; } } public class QpfNight { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("mm")] public int Milimeters { get; set; } } public class SnowAllday { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("cm")] public double Centimeters { get; set; } } public class SnowDay { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("cm")] public double Centimeters { get; set; } } public class SnowNight { [XmlElement("@in")] public double Inches { get; set; } [XmlElement("cm")] public double Centimeters { get; set; } } public class MaxWind { [XmlElement("mph")] public int Mph { get; set; } [XmlElement("kph")] public int Kph { get; set; } [XmlElement("dir")] public string Direction { get; set; } [XmlElement("degrees")] public int Degrees { get; set; } } public class AveWind { [XmlElement("mph")] public int Mph { get; set; } [XmlElement("kph")] public int Kph { get; set; } [XmlElement("dir")] public string Direction { get; set; } [XmlElement("degrees")] public int Degrees { get; set; } }

Response

我正在使用using (HttpClient client = new HttpClient()) { using (var stream = await client.GetStreamAsync("http://api.wunderground.com/api/ea4bb7e7839782da/forecast/q/CA/San_Francisco.xml")) { var serializer = new XmlSerializer(typeof(Response)); var response = (Response)serializer.Deserialize(stream); var simpleForecast = response.Forecast.SimpleForecast; var forecastDays = simpleForecast.ForecastDays; var latestForecastDay = forecastDays.Last(); var latestHighFahrenheit = latestForecastDay.High.Fahrenheit; var latestLowFahrenheit = latestForecastDay.Low.Fahrenheit; } } ,但您也可以使用更新的XmlSerializer。如果您决定使用DataContractSerializer,请注意,您需要将DataContractSerializer属性替换为XmlElementDataContract

注意:我故意添加了一些不必要的步骤和变量声明,因此您可以清楚地看到这里发生了什么。