使用VB.NET读取XML文件

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文件。
因此,我的问题是,如何从在线天气XML文件中提取所需的数据,并轻松快速地显示或保存到数据库中?
我正在使用.NET Framework 3.5中的ASP和VB进行开发。

不要忘记将其标记为已接受的答案,如果这对您有用的话。 - Pranay Rana
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可能是不合适的。更容易的方法是使用 XDocumentXmlDocument 或者 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

"通过 XML 循环" 会是怎样的呢? - user1676874
我在我的答案底部展示了一个使用XmlDocument的循环示例。我不确定如何使用xml文本阅读器遍历元素。如果您发布了使用该类加载单个预测的当前方法,我可能能够给您提供更详细的循环示例。 - Steven Doggart

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);
}

0

对于这种任务,可以使用LINQ来读取、更新、保存和删除XML数据。

即使用LINQ to XML,它将帮助您实现所需的功能。

有许多资源可供参考:

但是请查看msdn上的.NET语言集成查询XML数据


0
你尝试过使用 dataset.ReadXml 方法吗?如果你熟悉 dataset 结构,这会使得读取数据变得非常容易。它会将你的数据放入数据表中,以便你能够循环遍历。
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

希望这可以帮到你。

0

使用 XML 字面量在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接