3

今後 24 時間の天気予報を表示するこの Web ベースのアプリを構築しています。必要なすべてのデータが既に含まれている XML ファイルを読み込んでいます。ただし、ファイルには、次のような同様のタグにすべてのデータが含まれています。

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

ご覧のとおり、予測を入力し、その子を調べてデータを見つけ、次の予測とそのデータを読み取ることができるポイントに何らかの方法で戻る必要があります。私は現在、XMLTextReader を使用して読み取りを可能にし、ReadStartElement メソッドと ReadToNextSibling メソッドを使用してファイルをナビゲートしていますが、これらのメソッドを使用すると、ファイルを元に戻すことはできません。次の気温では、プログラムを次の予測に「正常に」進めるための For ループを使用する必要がありましたが、リソースを大量に消費し、天気 API への呼び出しが多すぎて、タイムアウト エラーが発生することさえありました。XML ファイルを Web サイトから自分のコンピューターのプロジェクトのディレクトリに保存すると機能します。そのようにすれば、正常に実行され、すべてのデータをすばやく取得できますが、

そこで私の質問は、どうすればこのオンライン天気 XML ファイルから必要なデータだけを抽出し、それを簡単かつ迅速に表示したり、データベースに保存したりできるでしょうか?

.NET Framework 3.5 で ASP と VB を使用しています。

4

5 に答える 5

5

これを行うにはいくつかの方法があります。最も簡単なのは、XMLTextReaderを使用して、現在の方法でXMLをロードし続けることですが、一度に1つだけロードするのではなく、すべてを一度にメモリにロードします。たとえば、次のようなクラスを作成した場合:

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

次に、予測をロードするコードで、1つだけではなくすべてをロードし、次のようなリストに格納します。

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

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 からのデータの読み取り、更新、保存、および削除に LINQ フレーバーを利用します。

つまり、目的を達成するのに役立つ 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

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
于 2012-09-17T15:08:44.697 に答える