2009-02-04 26 views
2

我是一名初級C#程序員,他正在嘗試開發一個庫,它允許我封裝解析從NWS返回的XML的討厭細節,並返回代表數據的集合。將C#LINQ中的國家氣象服務SOAP服務解析爲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的元素。

編輯: 這是我用它來從Web引用的XML代碼:

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個經緯度對...如果我的作品不是專有的=(我會分享源代碼... – 2009-02-04 23:11:02

+0

如果你僅僅使用一個數據點,你的問題就會容易得多 - 但是你需要記住不同的時間鍵,他們可以爲不同的時間參考mint和maxt,即使是相同的數據點,也取決於時間 – 2009-02-04 23:13:42

回答

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; 

希望這有助於。

注意:我在C#中使用Linq到Xml有點生疏,所以它可能不是最優雅的解決方案。

0

您可能會需要分析你回來使用XPath的XML拔出你想要的數據。有一個簡單的例子here

或者,您可以創建一個反映xml結構並使用XmlSerializer將xml反序列化爲對象的類結構,但這可能比在此情況下值得的更麻煩。