用VB.NET读取XML文件

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.

Ste*_*art 5

有几种方法可以做到这一点.最简单的方法是使用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,XmlDocumentXmlSerializer.例如,您可以轻松地将所有预测加载到列表中,就像我刚才所描述的那样使用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)