2009-02-04 5 views
2

Я младший программист на C#, который пытается создать библиотеку, которая позволит мне инкапсулировать неприятные детали анализа XML, возвращаемого из NWS, и возвращения набор, представляющий данные.Анализ XML с помощью службы SOAP в национальной службе погоды в C# LINQ to XML

Мой запрос SOAP будет возвращать документ XML в таком виде:

<?xml version="1.0" encoding="UTF-8"?> 
<dwml version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd"> 
    <head> 
    <product srsName="WGS 1984" concise-name="time-series" operational-mode="official"> 
     <title>NOAA's National Weather Service Forecast Data</title> 
     <field>meteorological</field> 
     <category>forecast</category> 
     <creation-date refresh-frequency="PT1H">2009-02-04T20:01:00Z</creation-date> 
    </product> 
    <source> 
     <more-information>http://www.nws.noaa.gov/forecasts/xml/</more-information> 
     <production-center>Meteorological Development Laboratory<sub-center>Product Generation Branch</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="42.23" longitude="-83.27"/> 
    </location> 
    <moreWeatherInformation applicable-location="point1">http://forecast.weather.gov/MapClick.php?textField1=42.23&amp;textField2=-83.27</moreWeatherInformation> 
    <time-layout time-coordinate="local" summarization="none"> 
     <layout-key>k-p24h-n7-1</layout-key> 
     <start-valid-time>2009-02-04T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-04T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-05T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-05T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-06T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-06T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-07T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-07T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-08T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-08T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-09T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-09T19:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-10T07:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-10T19:00:00-05:00</end-valid-time> 
    </time-layout> 
    <time-layout time-coordinate="local" summarization="none"> 
     <layout-key>k-p24h-n6-2</layout-key> 
     <start-valid-time>2009-02-04T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-05T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-05T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-06T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-06T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-07T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-07T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-08T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-08T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-09T08:00:00-05:00</end-valid-time> 
     <start-valid-time>2009-02-09T19:00:00-05:00</start-valid-time> 
     <end-valid-time>2009-02-10T08:00:00-05:00</end-valid-time> 
    </time-layout> 
    <parameters applicable-location="point1"> 
     <temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n7-1"> 
     <name>Daily Maximum Temperature</name> 
     <value>15</value> 
     <value>19</value> 
     <value>33</value> 
     <value>46</value> 
     <value>41</value> 
     <value>43</value> 
     <value>44</value> 
     </temperature> 
     <temperature type="minimum" units="Fahrenheit" time-layout="k-p24h-n6-2"> 
     <name>Daily Minimum Temperature</name> 
     <value>-2</value> 
     <value>16</value> 
     <value>29</value> 
     <value>32</value> 
     <value>27</value> 
     <value>32</value> 
     </temperature> 
    </parameters> 
    </data> 
</dwml> 

Я пытаюсь поставить максимальные и минимальные временные секретари, которые находятся внутри этого XML в отдельных сборниках строк, игнорируя при этом «имя» элементов, использующих LINQ.

Edit: Это код, я использую, чтобы получить XML из Web Reference:

WeatherNWS.ndfdXML client = new TestNWS.WeatherNWS.ndfdXML(); 

    string XMLZip = client.LatLonListZipCode("48180"); 

    XElement myElement = XElement.Parse(XMLZip); 
    string[] myString = myElement.Value.Split(','); 

    decimal lat = Convert.ToDecimal(myString[0]); 
    decimal lon = Convert.ToDecimal(myString[1]); 

    weatherParametersType parameters = new weatherParametersType(); 

    parameters.maxt = true; 
    parameters.mint = true; 

    string XML = client.NDFDgen(lat, lon, productType.timeseries, DateTime.Now, DateTime.Now.AddDays(7), parameters); 
+0

Хех, я * только что закончил * создаю компонент, который делает именно это до 500 пар lat/lon за один раз ... Если моя работа не была запатентованной = (я бы разделил источник ... –

+0

Ваша проблема значительно упрощается, если вы работаете только с одной точкой данных, но вам нужно иметь в виду разные клавиши времени. Они могут ссылаться на разные дни для монетного двора и maxt, даже для одной и той же точки данных, в зависимости от времени –

+1

Что вы подразумеваете под «одной точкой данных?» – M4dRefluX

ответ

3

Это должно быть в состоянии получить максимальные температуры для вас, вы просто должны изменить где фильтр, чтобы получить минимальные

using System.Xml.Linq; 
\\... 

XDocument xmlDoc = XDocument.Load("YourXml.xml"); 
var maximums = from tempvalue in xmlDoc.Descendants("temperature").Elements("value") 
          where tempvalue.Parent.Attribute("type").Value == "maximum" 
          select (string)tempvalue; 

List<string> returnme = maximums.ToList<string>(); 
return returnme; 

Надежда эта помощь.

Примечание: Я немного ржавый с моим Linq для Xml на C#, поэтому это может быть не самое элегантное решение.

+0

Внутри Descendants нет метода Elements. – M4dRefluX

+0

убедитесь, что у вас есть пространство имен System.Xml.Linq. См. мое редактирование. –

+0

Добавлено, он просто появляется в качестве общего расширения, хотя. – M4dRefluX

0

Вы, вероятно, нужно разобрать XML вы получите обратно с XPath, чтобы вытащить данные, которые вы хотите , Вот краткий пример here.

В качестве альтернативы вы можете создать структуру класса, которая отражает структуру xml, и использовать XmlSerializer для десериализации xml в объекты, но это, вероятно, больше проблем, чем в этом случае.