2015-06-01 19 views
0

Я пытаюсь получить значения из запроса Soap, который я сделал. Он поставляется в формате XML, по какой-то причине я не могу получить только значения. Как я могу? Как получить максимальные и минимальные значения температуры?Parsing Мыло запрос в XML C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using WeatherData.Weather_Gov; 
using System.Xml.Linq; 

namespace WeatherData 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ndfdXMLPortTypeClient client = new ndfdXMLPortTypeClient(); 


      weatherParametersType weatherParams = new weatherParametersType(); 

      string weatherData; 

      decimal lat = (decimal)(31.5452); 
      decimal lon = (decimal)-109.468; 

      weatherData = client.NDFDgenByDay(lat, lon, DateTime.Now.ToUniversalTime().AddDays(-1), "2", "e", "12 hourly"); 

      var myElement = XElement.Parse(weatherData); 

      Console.WriteLine(weatherData); 
      Console.ReadKey(); 
     } 
    } 
} 

Это выход, что я получил в моем окне консольного приложения.

<?xml version="1.0"?> 
<dwml version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/20 
01/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.nws.noaa.gov/forecasts/xml/DWML 
gen/schema/DWML.xsd"> 
    <head> 
    <product srsName="WGS 1984" concise-name="dwmlByDay" operational-mode="official"> 
     <title>NOAA's National Weather Service Forecast by 12 Hour Period</title> 
     <field>meteorological</field> 
     <category>forecast</category> 
     <creation-date refresh-frequency="PT1H">2015-06-01T15:16:52Z</creation-date> 
    </product> 
    <source> 
     <more-information>http://www.nws.noaa.gov/forecasts/xml/</more-information> 
     <production-center>Meteorological Development Laboratory<sub-center>Product Generation Bra 
nch</sub-center></production-center> 
     <disclaimer>http://www.nws.noaa.gov/disclaimer.html</disclaimer> 
     <credit>http://www.weather.gov/</credit> 
     <credit-logo>http://www.weather.gov/images/xml_logo.gif</credit-logo> 
     <feedback>http://www.weather.gov/feedback.php</feedback> 
    </source> 
    </head> 
    <data> 
    <location> 
     <location-key>point1</location-key> 
     <point latitude="31.55" longitude="-109.47"/> 
    </location> 
    <moreWeatherInformation applicable-location="point1">http://forecast.weather.gov/MapClick.ph 
p?textField1=31.55&amp;textField2=-109.47</moreWeatherInformation> 
    <time-layout time-coordinate="local" summarization="12hourly"> 
     <layout-key>k-p24h-n1-1</layout-key> 
     <start-valid-time period-name="Today">2015-06-01T06:00:00-07:00</start-valid-time> 
     <end-valid-time>2015-06-01T18:00:00-07:00</end-valid-time> 
    </time-layout> 
    <time-layout time-coordinate="local" summarization="12hourly"> 
     <layout-key>k-p24h-n1-2</layout-key> 
     <start-valid-time period-name="Tonight">2015-06-01T18:00:00-07:00</start-valid-time> 
     <end-valid-time>2015-06-02T06:00:00-07:00</end-valid-time> 
    </time-layout> 
    <time-layout time-coordinate="local" summarization="12hourly"> 
     <layout-key>k-p12h-n2-3</layout-key> 
     <start-valid-time period-name="Today">2015-06-01T06:00:00-07:00</start-valid-time> 
     <end-valid-time>2015-06-01T18:00:00-07:00</end-valid-time> 
     <start-valid-time period-name="Tonight">2015-06-01T18:00:00-07:00</start-valid-time> 
     <end-valid-time>2015-06-02T06:00:00-07:00</end-valid-time> 
    </time-layout> 
    <time-layout time-coordinate="local" summarization="12hourly"> 
     <layout-key>k-p1d-n1-4</layout-key> 
     <start-valid-time>2015-06-01T06:00:00-07:00</start-valid-time> 
     <end-valid-time>2015-06-02T06:00:00-07:00</end-valid-time> 
    </time-layout> 
    <parameters applicable-location="point1"> 
     <temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n1-1"> 
     <name>Daily Maximum Temperature</name> 
     <value>94</value> 
     </temperature> 
     <temperature type="minimum" units="Fahrenheit" time-layout="k-p24h-n1-2"> 
     <name>Daily Minimum Temperature</name> 
     <value>58</value> 
     </temperature> 
     <probability-of-precipitation type="12 hour" units="percent" time-layout="k-p12h-n2-3"> 
     <name>12 Hourly Probability of Precipitation</name> 
     <value>4</value> 
     <value>2</value> 
     </probability-of-precipitation> 
     <weather time-layout="k-p12h-n2-3"> 
     <name>Weather Type, Coverage, and Intensity</name> 
     <weather-conditions weather-summary="Mostly Sunny"/> 
     <weather-conditions weather-summary="Mostly Clear"/> 
     </weather> 
     <conditions-icon type="forecast-NWS" time-layout="k-p12h-n2-3"> 
     <name>Conditions Icons</name> 
     <icon-link>http://www.nws.noaa.gov/weather/images/fcicons/few.jpg</icon-link> 
     <icon-link>http://www.nws.noaa.gov/weather/images/fcicons/nfew.jpg</icon-link> 
     </conditions-icon> 
     <hazards time-layout="k-p1d-n1-4"> 
     <name>Watches, Warnings, and Advisories</name> 
     <hazard-conditions xsi:nil="true"/> 
     </hazards> 
    </parameters> 
    </data> 
</dwml> 

Как я вытащить, например, Daily Max Temp?

<temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n1-1"> 
     <name>Daily Maximum Temperature</name> 
     <value>94</value> 
    </temperature> 
+1

Juan9 - возможно, будет проще, если вы просто сложите выход и введите в две коробки, чтобы они были более очевидны для людей, пытающихся помочь. И дайте понять, что вы хотите добраться до ежедневной минимальной температуры = 58. Здесь здесь слишком много деталей. – micstr

+0

Я пробовал, но мне нужно больше очков репутации, чтобы они разделились. – Juan9

+0

Хорошо, я отредактирую для вас. – micstr

ответ

2

Так как только вы разобраны ваш XML к XElement, можно использовать LINQ к XML API для запроса его:

var max = element.Descendants("temperature") 
    .Where(e => (string)e.Element("name") == "Daily Maximum Temperature") 
    .Select(e => (int)e.Element("value")) 
    .Single(); 

var min = element.Descendants("temperature") 
    .Where(e => (string)e.Element("name") == "Daily Minimum Temperature") 
    .Select(e => (int)e.Element("value")) 
    .Single(); 

Если вы имели несколько значений, то вы могли бы перебирать последовательность целых чисел:

+0

спасибо. Это было РАБОТАЮТ :). Я очень ценю это. – Juan9

+0

Что делать, если у меня есть 2 значения в ежедневной максимальной температуре? Я попробовал foreach, и это только дает мне первое значение. – Juan9

+0

@ Juan9 добавил для этого вариант. –