尝试用 C# 制作一个天气程序,但它不会带回任何东西,除了 API 中的国家代码
Trying to make a weather program in C#, but it won't bring back anything except the country code from the API
因此,如果我按下按钮,此代码应该会显示 min/max 温度、风速、湿度和国家/地区代码。但是,它只带回国家代码,我不知道为什么。它没有显示任何错误,但是当我按下按钮时,一切都发生了。如果有人可以查看我的代码并告诉我我做错了什么,那将不胜感激。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Net;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string uri = string.Format("http://api.openweathermap.org/data/2.5/weather?q=Seoul&mode=xml&appid=78dff84492be32f8b4f77692904607a1");
XDocument doc = XDocument.Load(uri);
WebClient client = new WebClient();
string maxTemp = (string)doc.Descendants("temperature.max").FirstOrDefault();
string minTemp = (string)doc.Descendants("temperature.min").FirstOrDefault();
string maxWindm = (string)doc.Descendants("wind.speed.unit").FirstOrDefault();
string humidity = (string)doc.Descendants("humidity.value").FirstOrDefault();
string country = (string)doc.Descendants("country").FirstOrDefault();
txtmaxtemp.Text = maxTemp;
txtmintemp.Text = minTemp;
txtwindm.Text = maxWindm;
txthumidity.Text = humidity;
txtcountry.Text = country;
}
}
}
给定 uri 的 XML 实际上看起来像这样:
<current>
<city id="1835848" name="Seoul">
<coord lon="126.98" lat="37.57"/>
<country>KR</country>
<timezone>32400</timezone>
<sun rise="2019-12-06T22:33:04" set="2019-12-07T08:13:43"/>
</city>
<temperature value="270.15" min="266.15" max="274.15" unit="kelvin"/>
<humidity value="86" unit="%"/>
<pressure value="1029" unit="hPa"/>
<wind>
<speed value="1.25" unit="m/s" name="Calm"/>
<gusts/>
<direction value="302" code="WNW" name="West-northwest"/>
</wind>
<clouds value="90" name="overcast clouds"/>
<visibility value="10000"/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04n"/>
<lastupdate value="2019-12-07T12:41:00"/>
</current>
查看country
-节点时,您可以看到它是一个xml-节点。相反,min
- 和 max
-温度是 temperature
-节点的 属性 。
您可以像这样访问属性:
string maxTemp = (string)doc.Descendants("temperature").FirstOrDefault().Attribute("max").Value;
请注意,这会起作用,但它很容易出现 NullReferenceException
,因为我盲目地使用 FirstOrDefault()
;-)
因此,如果我按下按钮,此代码应该会显示 min/max 温度、风速、湿度和国家/地区代码。但是,它只带回国家代码,我不知道为什么。它没有显示任何错误,但是当我按下按钮时,一切都发生了。如果有人可以查看我的代码并告诉我我做错了什么,那将不胜感激。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Net;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string uri = string.Format("http://api.openweathermap.org/data/2.5/weather?q=Seoul&mode=xml&appid=78dff84492be32f8b4f77692904607a1");
XDocument doc = XDocument.Load(uri);
WebClient client = new WebClient();
string maxTemp = (string)doc.Descendants("temperature.max").FirstOrDefault();
string minTemp = (string)doc.Descendants("temperature.min").FirstOrDefault();
string maxWindm = (string)doc.Descendants("wind.speed.unit").FirstOrDefault();
string humidity = (string)doc.Descendants("humidity.value").FirstOrDefault();
string country = (string)doc.Descendants("country").FirstOrDefault();
txtmaxtemp.Text = maxTemp;
txtmintemp.Text = minTemp;
txtwindm.Text = maxWindm;
txthumidity.Text = humidity;
txtcountry.Text = country;
}
}
}
给定 uri 的 XML 实际上看起来像这样:
<current>
<city id="1835848" name="Seoul">
<coord lon="126.98" lat="37.57"/>
<country>KR</country>
<timezone>32400</timezone>
<sun rise="2019-12-06T22:33:04" set="2019-12-07T08:13:43"/>
</city>
<temperature value="270.15" min="266.15" max="274.15" unit="kelvin"/>
<humidity value="86" unit="%"/>
<pressure value="1029" unit="hPa"/>
<wind>
<speed value="1.25" unit="m/s" name="Calm"/>
<gusts/>
<direction value="302" code="WNW" name="West-northwest"/>
</wind>
<clouds value="90" name="overcast clouds"/>
<visibility value="10000"/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04n"/>
<lastupdate value="2019-12-07T12:41:00"/>
</current>
查看country
-节点时,您可以看到它是一个xml-节点。相反,min
- 和 max
-温度是 temperature
-节点的 属性 。
您可以像这样访问属性:
string maxTemp = (string)doc.Descendants("temperature").FirstOrDefault().Attribute("max").Value;
请注意,这会起作用,但它很容易出现 NullReferenceException
,因为我盲目地使用 FirstOrDefault()
;-)