2013-05-10 16 views
6

Próbuję odczytać dane pogodowe z XML w URL. XML wygląda tak:C# wyodrębnianie danych z XML

<weatherdata> 
<location>...</location> 
<credit>...</credit> 
<links>...</links> 
<meta>...</meta> 
<sun rise="2013-05-11T04:49:22" set="2013-05-11T21:39:03"/> 
<forecast> 
<text>...</text> 
<tabular> 
<time from="2013-05-11T01:00:00" to="2013-05-11T06:00:00" period="0"> 
<!-- 
Valid from 2013-05-11T01:00:00 to 2013-05-11T06:00:00 
--> 
<symbol number="2" name="Fair" var="mf/02n.03"/> 
<precipitation value="0" minvalue="0" maxvalue="0.1"/> 
<!-- Valid at 2013-05-11T01:00:00 --> 
<windDirection deg="173.8" code="S" name="South"/> 
<windSpeed mps="4.2" name="Gentle breeze"/> 
<temperature unit="celsius" value="9"/> 
<pressure unit="hPa" value="1004.2"/> 
</time> 
</tabular> 
</forecast> 
<observations>...</observations> 
</weatherdata> 

Interesują mnie dane prognozy w XML. Chcę uzyskać czas od i czas, a następnie dane pogodowe. Na przykład temperatura jest napisane jak to w XML:

<temperature unit="celsius" value="9"/> 

chcę wyodrębnić dane z mniej więcej tak:

string fromTime = time from(the attribute in the xml); 
        string fromTime =time to(the attribute in the xml); 
        string name = temperature(the attribute in the xml); 
        string unit =unit(the attribute in the xml); 
        int value = value(the attribute in the xml); 

stworzyłem przykładowy kod, który jest w stanie przeczytać wszystkiego, ale I don Nie wiem, jak wyodrębnić tylko te dane, których potrzebuję. Kod, który mam teraz wygląda:

 String URLString = "http://www.yr.no/place/Norway/Oslo/Oslo/Oslo/forecast.xml"; 
     XmlTextReader reader = new XmlTextReader(URLString); 

     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: // The node is an element. 
        Console.Write("" + reader.Name); 

        while (reader.MoveToNextAttribute()) // Read the attributes. 
         Console.Write(" " + reader.Name + "='" + reader.Value + "'"); 
        Console.Write("\n"); 
        Console.WriteLine("------------------------------"); 
        break; 
       case XmlNodeType.Text: //Display the text in each element. 
        Console.WriteLine(reader.Value); 
        break; 
       case XmlNodeType.EndElement: //Display the end of the element. 
        Console.Write("</" + reader.Name); 
        Console.WriteLine(">"); 
        break; 

      } 
     } 

Jakieś pomysły, w jaki sposób mogę wyciągnąć tylko dane pogodowe i czas?

+1

Czy korzystanie z .Net 2.0 lub wcześniejszej wersji jest ograniczone? Jeśli nie, polecam używanie Linq do XML. – Gjeltema

Odpowiedz

6

używać LINQ do XML

XDocument X = XDocument.Load("http://www.yr.no/place/Norway/Oslo/Oslo/Oslo/forecast.xml"); 

var forecast = X.Element("weatherdata").Element("forecast"); 
var location = forecast.Descendants("location").Attributes("name").FirstOrDefault().Value; 
var tempData = forecast.Element("tabular").Elements("time"); 

//This is what you need 
var data = tempData.Select(item=> 
      new{ 
       from = Convert.ToDateTime(item.Attribute("from").Value), 
       to = Convert.ToDateTime(item.Attribute("to").Value), 
       temp = item.Element("temperature").Attribute("value").Value 
      }); 


//Or you can do a foreach if you need to 
foreach (var item in tempData) 
{ 
     DateTime from = Convert.ToDateTime(item.Attribute("from").Value); 
     var temp = item.Element("temperature").Attribute("value").Value; 
} 

Nie zaludnionych wszystko. Mam nadzieję, że wpadniesz na pomysł, jak go użyć.

+0

Bardzo dziękuję za to, czego potrzebowałem !! – user1810659

+0

jak zrobić to samo dla mojego pliku XML: http://stackoverflow.com/questions/24268245/how-to-extract-every-occurence-of-tags-in-an-xml-file – Si8

4

Użyj XElement z System.Xml.Linq

XElement all = XElement.Load(reader); 
var values = all.Decentents("forecast").Select(fc => { 
    XElement time = fc.Element("time"); 
    XElement temp = fc.Element("temperature"); 
    return new Tuple<string, string, string, string>(
        time.Attribute("from").Value, 
        time.Attribute("to").Value, 
        temperature.Attribute("unit").Value, 
        temperature.Attribute("value").Value);}); 
+0

Dzięki! to pomogło :) – user1810659