3

我正在构建这个基于 Web 的应用程序,它将显示未来 24 小时的天气预报,我正在读取一个包含我需要的所有数据的 XML 文件。然而,该文件包含类似标签中的所有数据,如下所示:

<response>
 <hourly_forecast>
  <forecast>
   <temp>
    <metric>DATA!</metric>
   </temp>
  </forecast>
  <forecast>
   <temp>
    <metric>MORE DATA!</metric>
   ...

正如你所看到的,我必须输入一个预测,遍历它的子节点,找到数据,然后以某种方式回到我可以读取下一个预测及其数据的点,等等。我目前正在使用 XMLTextReader 能够阅读,并使用 ReadStartElement 和 ReadToNextSibling 方法来浏览文件,但是使用这些方法你无法在文件中备份,你只能下车进入,所以为了阅读下一个温度我不得不使用 For 循环,使程序“成功”进入下一个预测,但它变得非常耗费资源,对天气 API 的调用太多,甚至发出超时错误。如果我将网站上的 XML 文件保存到计算机上的项目目录中,它确实可以工作,这样它就可以正常运行并快速获取所有数据,但是,

所以我的问题是,我怎样才能从这个在线天气 XML 文件中提取我需要的数据,然后轻松快速地显示或保存到数据库中?

我在 .NET Framework 3.5 上使用 ASP 和 VB。

4

5 回答 5

5

有几种方法可以做到这一点。最简单的方法是使用 XMLTextReader 继续以现有方式加载 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

然后,在加载预测的代码中,加载所有预测,而不是仅加载一个,并将它们存储在如下列表中:

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

然后,稍后,当您需要特定的预测时,您可以从内存中已加载的列表中检索它:

' Get the first forecast
Dim f As Forecast = forecasts(0)

' Get the second forecast
f = forecasts(1)

' Etc.

但是,我认为使用您所描述的 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
于 2012-09-17T13:17:46.833 回答
0

对于此类任务,请使用 LINQ 风格从 XML 中读取、更新、保存和删除数据。

即利用 LINQ to XML 来帮助你实现你想要的。

有源代码:

但看看那里的msdn:.NET Language-Integrated Query for XML Data

于 2012-09-17T07:38:11.200 回答
0
XDocument xmlDoc= XDocument.Load(@"c:sites.xml");
var q = from c in xmlDoc.Descendants("site")
select (string)c.Element("name") + " -- " +(string)c.Element("url");
foreach (string name in q) {
Console.WriteLine("Site: " + name);
}
于 2012-09-17T07:42:23.547 回答
0

您是否尝试过使用 dataset.ReadXml 方法。如果您熟悉数据集结构,这将使读取数据变得非常容易。它会将您的数据放入数据表中,以便您能够循环访问。

Dim ds As New DataSet
ds.ReadXml("File Text as String")
For Each row as DataRow in ds.Tables("Forecast").Rows
  'Store your data'
Next

希望这可以帮助。

于 2012-09-17T12:08:02.020 回答
0

使用 XML Literals 在 VB 中重写@Pushpendra 的示例:

Dim xmlDoc= XDocument.Load(@"c:sites.xml")
Dim query = From c in xmlDoc...<site>
            Select c.<name>.Value & " -- " & c.<url>.Value

For Each name In query
     Console.WriteLine("Site: " + name)
Next
于 2012-09-17T15:08:44.697 回答