我正在构建这个基于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。
答案 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可能是错误的。使用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
答案 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