用VB.NET读取XML文件

时间:2012-09-17 07:34:39

标签: asp.net xml vb.net web

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

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

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

所以我的问题是,如何从这个在线天气XML文件中提取我需要的数据,并将其显示或轻松快速地保存到数据库中?

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

5 个答案:

答案 0 :(得分: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

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

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可能是错误的。使用XDocumentXmlDocumentXmlSerializer会更容易。例如,您可以轻松地将所有预测加载到列表中,就像我刚才所描述的那样使用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

答案 1 :(得分:0)

对于这种类型的任务使用LINQ flavor来读取,更新,保存和删除XML中的数据。

即。使用LINQ to XML来帮助您实现所需。

有源的编号:

但是请看那边的msdn:.NET Language-Integrated Query for XML Data

答案 2 :(得分: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);
}

答案 3 :(得分: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

希望这有帮助。

答案 4 :(得分: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