use*_*874 3 xml vb.net asp.net web
我正在构建这个基于Web的应用程序,它将显示接下来24小时的天气预报,我正在阅读一个XML文件,其中包含我需要的所有数据.但是,该文件包含类似标签中的所有数据,如下所示:
<response>
<hourly_forecast>
<forecast>
<temp>
<metric>DATA!</metric>
</temp>
</forecast>
<forecast>
<temp>
<metric>MORE DATA!</metric>
...
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我必须输入预测,查看其子项,查找数据,然后以某种方式回到我可以阅读下一个预测及其数据等的时刻.我目前正在使用XMLTextReader来读取,而ReadStartElement和ReadToNextSibling方法可以在文件中导航,但是使用那些你无法在文件中备份的方法,你只能进入并进入,所以为了阅读下一个温度我不得不使用For循环使程序成功进入下一个预测,但它变得非常耗费资源,对Weather API的调用过多,甚至发出超时错误.如果我将XML文件从网站保存到我计算机上的项目目录,它确实有效,这样它就可以正常运行并快速获取所有数据,但是,上传后我将无法保存XML文件这个网站到服务器.
所以我的问题是,如何从这个在线天气XML文件中提取我需要的数据,并显示它或者将其轻松快速地保存到数据库中?
我在.NET Framework 3.5上使用ASP和VB.
有几种方法可以做到这一点.最简单的方法是使用XMLTextReader以您现有的方式继续加载XML,但不是一次只加载一个XML,而是将所有这些加载到内存中.例如,如果您创建了这样的类:
Public Class Forecast
Public Property Temperature() As Integer
Get
Return _temperature
End Get
Set(ByVal value As Integer)
_temperature = value
End Set
End Property
Private _temperature As Integer
' ... Other properties
End Class
Run Code Online (Sandbox Code Playgroud)
然后,在加载预测的代码中,加载所有内容,而不是仅加载一个,并将它们存储在如下列表中:
Dim forecasts As New List(Of Forecast)()
' Loop through XML, and then for each forecast in XML:
Dim f As New Forecast()
f.Temperature = ' Set value based on current forecast data
forecasts.Add(f)
' End loop
Run Code Online (Sandbox Code Playgroud)
然后,稍后,当您需要特定预测时,您可以从内存中已加载的列表中检索它:
' Get the first forecast
Dim f As Forecast = forecasts(0)
' Get the second forecast
f = forecasts(1)
' Etc.
Run Code Online (Sandbox Code Playgroud)
但是,我认为如您所述使用XMLTextReader可能是错误的.这将是更容易使用XDocument,XmlDocument或XmlSerializer.例如,您可以轻松地将所有预测加载到列表中,就像我刚才所描述的那样使用XmlDocument类:
Dim forecasts As New List(Of Forecast)()
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
For Each forecastNode As XmlNode In doc.SelectNodes("/response/hourly_forecast/forecast")
Dim f As New Forecast()
f.Temperature = Integer.Parse(forecastNode.SelectSingleNode("temp/metric").InnerText)
Next
Run Code Online (Sandbox Code Playgroud)