使用XmLReader将XML数据解析为C#
我正在做我的学校项目,关于使用天气数据,我只需要温度。 以下是一个例子:使用XmLReader将XML数据解析为C#,c#,xml,C#,Xml,我正在做我的学校项目,关于使用天气数据,我只需要温度。 以下是一个例子: <time day="2014-05-01"> <symbol number="500" name="light rain" var="10d"/> <precipitation value="0.5" type="rain"/> <temperature day="7.6" min="6.8" max="7.6" night="6.8" eve="7.6" mo
<time day="2014-05-01">
<symbol number="500" name="light rain" var="10d"/>
<precipitation value="0.5" type="rain"/>
<temperature day="7.6" min="6.8" max="7.6" night="6.8" eve="7.6" morn="7.6"/>
<clouds value="overcast clouds" all="88" unit="%"/>
</time>
然后,这里有一个问题
while (myXmlReader.Read())
它说{“根级别的数据无效。第1行,位置1。”}。当我不使用变量link
并直接添加链接时,不会发生这种情况:
WebRequest myRequest = WebRequest.Create(@"http://api.openweathermap.org/data/2.5/forecast/daily?q=London&mode=xml&units=metric&cnt=17");
非常感谢您的帮助
关于变量city
:
<form>
City: <select name="city">
<option value="Helsinki">Helsinki</option>
<option value="Lahti">Lahti</option>
<option value="Tampere">Tampere</option>
<option value="Oulu">Oulu</option>
<option value="Rovaniemi">Rovaniemi</option>
<option value="Espoo">Espoo</option>
<option value="Vantaa">Vantaa</option>
</select> <br/>
<input type="submit" value="Submit to see the result"/>
</form>
<%string city = Request["city"]%>
城市:
赫尔辛基
拉赫蒂
坦佩雷
奥鲁
罗瓦涅米
艾斯堡
万塔
您在处理元素时遗漏了这些元素,一旦您找到时间
元素,您就不能也在温度
元素上。您必须继续阅读xml文档,直到找到该元素为止。我结合了几个if来压缩代码,但这确实有效:
var city="London";
var url = String.Format(
"http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
, city);
string temperature = String.Empty;
string day ="2014-05-02";
using(var wc = new WebClient())
{
using(var stream = wc.OpenRead(url))
{
using(var myXmlReader = new XmlTextReader(stream))
{
while (myXmlReader.Read())
{
// <time day="2014-05-01">
if (myXmlReader.NodeType == XmlNodeType.Element
&& myXmlReader.Name == "time"
&& myXmlReader.HasAttributes
&& myXmlReader.GetAttribute("day") == day)
{
// find the inner elements
while (myXmlReader.Read())
{
// skip <symbol> <precipitation> <windDirection>
// and <windSpeed>
if (myXmlReader.NodeType == XmlNodeType.Element
&& myXmlReader.Name == "temperature"
&& myXmlReader.HasAttributes
&& myXmlReader.GetAttribute("day") != null)
{
// <temperature day="7.83" min="6.76" max="7.83"
// night="6.76" eve="7.83" morn="7.83"/>
temperature = myXmlReader.GetAttribute("day");
break; // stop reading!
}
}
}
}
}
}
}
您可能应该查看XDocument。使用streamreader加载xml。查看本文,特别是使用XmlReader读取数据的部分。你也可以使用XMLDocument类。如果你进行调试,
city
的值是多少?例如,如果你愿意,它可以是伦敦。所有这些嵌套的if语句让我痛苦地哭泣。这是非常糟糕的代码,尤其是因为您重复了许多语句。永远不要,每个人都这样做。谢谢你的帮助。但是它也表示{“根级别的数据无效。第1行,位置1。”}位于而(myXmlReader.Read())
。我不知道为什么?这可能是因为您的城市变量为空或不正确。如果调试到创建url的位置,则可以检查完整url的值。或者,您可以使用查看发送了哪些请求。或者您可以添加一个跟踪;然后访问/trace.axd,如中所述。您的bug不在显示的代码中。我正在做一个web应用程序,所以城市将由用户决定(一些城市的选择表格可用)。因此,变量city
在加载web之前不会分配任何值。您最好问一个关于city变量为空的新问题。确保您的问题显示了aspx标记和代码隐藏。您应该首先自己调试代码:
<form>
City: <select name="city">
<option value="Helsinki">Helsinki</option>
<option value="Lahti">Lahti</option>
<option value="Tampere">Tampere</option>
<option value="Oulu">Oulu</option>
<option value="Rovaniemi">Rovaniemi</option>
<option value="Espoo">Espoo</option>
<option value="Vantaa">Vantaa</option>
</select> <br/>
<input type="submit" value="Submit to see the result"/>
</form>
<%string city = Request["city"]%>
var city="London";
var url = String.Format(
"http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
, city);
string temperature = String.Empty;
string day ="2014-05-02";
using(var wc = new WebClient())
{
using(var stream = wc.OpenRead(url))
{
using(var myXmlReader = new XmlTextReader(stream))
{
while (myXmlReader.Read())
{
// <time day="2014-05-01">
if (myXmlReader.NodeType == XmlNodeType.Element
&& myXmlReader.Name == "time"
&& myXmlReader.HasAttributes
&& myXmlReader.GetAttribute("day") == day)
{
// find the inner elements
while (myXmlReader.Read())
{
// skip <symbol> <precipitation> <windDirection>
// and <windSpeed>
if (myXmlReader.NodeType == XmlNodeType.Element
&& myXmlReader.Name == "temperature"
&& myXmlReader.HasAttributes
&& myXmlReader.GetAttribute("day") != null)
{
// <temperature day="7.83" min="6.76" max="7.83"
// night="6.76" eve="7.83" morn="7.83"/>
temperature = myXmlReader.GetAttribute("day");
break; // stop reading!
}
}
}
}
}
}
}
string WheaterFromXDocument()
{
var city="London";
var url = String.Format(
"http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
, city);
string temperature = String.Empty;
string day ="2014-05-02";
using(var wc = new WebClient())
{
using(var stream = wc.OpenRead(url))
{
var dayAttr = (from time in XDocument.Load(stream).Descendants("time")
where (string) time.Attribute("day") == day
from tempElem in time.Elements("temperature")
select tempElem.Attribute("day"))
.SingleOrDefault();
if (dayAttr!=null)
{
temperature = dayAttr.Value;
}
}
}
return temperature;
}