2012-09-17 212 views
3

我正在構建這個基於網絡的應用程序,它將顯示接下來24小時的天氣預報,我正在閱讀一個XML文件,其中包含我需要的所有數據。然而,該文件包含所有類似的標籤這樣的數據:用VB.NET讀取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文件中提取我需要的數據,並且顯示它或將它保存到數據庫方便又快捷?

我正在使用ASP和VB的.NET框架3.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. 

Howev呃,我想如你所描述的那樣使用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 
+0

循環「通過XML」將如何? – user1676874

+0

我在使用XmlDocument的答案底部顯示了一個循環示例。我不確定,究竟如何使用XML文本閱讀器遍歷元素。如果你發佈瞭如果你可以展示你目前如何使用該類加載單一預測,我可能會給你一個更詳細的循環示例。 –

0

對於這樣的任務使用LINQ flavor來讀取,更新,保存和刪除XML中的數據。

即使用LINQ to XML,它可以幫助你實現你想要的。

對於源號碼是:

,但有看MSDN那邊:.NET Language-Integrated Query for XML Data

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

您是否嘗試過使用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 

希望這會有所幫助。

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