2013-12-14 50 views
1

我想讀取來自API的XML響應數據,即wunderground API for weather forecasting。我已經使用下面的代碼來閱讀它。如何從XML文檔中選擇單個節點?

HttpWebRequest GoogleRequest; 
    HttpWebResponse GoogleResponse = null; 
    XmlDocument GoogleXMLdoc = null; 
    try 
    { 
     GoogleRequest = (HttpWebRequest)WebRequest.Create("http://api.wunderground.com/api/c94ec600fe494bc2/astronomy/q/Cayman/Grand.xml"); 
     GoogleResponse = (HttpWebResponse)GoogleRequest.GetResponse(); 
     GoogleXMLdoc = new XmlDocument(); 
     GoogleXMLdoc.Load(GoogleResponse.GetResponseStream()); 

     XmlNode root = GoogleXMLdoc.DocumentElement; 

     //XmlNodeList nodeList1 = root.SelectNodes("/sunset/"); 
     XmlNode test = root.SelectSingleNode("/moon_phase/"); 
    } 
//..... 

但我例外表達式必須計算節點集合上的代碼的最後一行。我嘗試了一些解決方案,但我無法獲取數據。其實想要的是:我想獲得日落時間和日出時間。請幫我解決這個問題。

+0

嘗試'// moon_phase' –

回答

3

當你想獲得通過XPath的XML你應該得到像這樣的:

XmlNode test = root.SelectSingleNode("//moon_phase/percentIlluminated"); 

或者

 XmlNode test = root.SelectSingleNode("//moon_phase/*"); 

或者

GoogleXMLdoc.SelectSingleNode("//moon_phase[0]"); 

這是你的結果:

<version>0.1</version><termsofService>http://www.wunderground.com/weather/api/d/terms.html</termsofService> 
<features><feature>astronomy</feature></features> 
<moon_phase><percentIlluminated>91</percentIlluminated><ageOfMoon>12</ageOfMoon><current_time><hour>1</hour><minute>51</minute></current_time><sunset><hour>17</hour><minute>50</minute></sunset><sunrise><hour>6</hour><minute>51</minute></sunrise></moon_phase><sun_phase><sunset><hour>17</hour><minute>50</minute></sunset><sunrise><hour>6</hour><minute>51</minute></sunrise></sun_phase> 

看到這個Site

<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> 
    <actors> 
     <actor id="1">Christian Bale</actor> 
     <actor id="2">Liam Neeson</actor> 
     <actor id="3">Michael Caine</actor> 
    </actors> 
    <foo:singers> 
     <foo:singer id="4">Tom Waits</foo:singer> 
     <foo:singer id="5">B.B. King</foo:singer> 
     <foo:singer id="6">Ray Charles</foo:singer> 
    </foo:singers> 
</root> 

選擇文檔節點

/

選擇「根」元素

/根

選擇所有「演員」元素是「演員」元素的直接子。

/根/演員/演員

選擇所有「歌手」的元素,無論其在文檔中的位置。

//富:歌手

選擇不管「歌手」元素的「身份證」屬性的文檔中的位置。

//富:歌手/ @ ID

選擇第一個 '演員' 元素的文本值。

//演員1 /文()

選擇最後一個 '演員' 元素。

//演員[最後()]

使用它們的位置選擇所述第一和第二 '演員' 的元件。

//演員[位置()< 3]

選擇具有 'id' 屬性的所有 '演員' 的元件。

//演員[@id]

選擇具有 'ID' 的 '演員' 元素屬性的 '3' 的值。

//演員[@ ID = '3']

選擇具有 'ID' 所有 '演員' 的節點屬性值低於或等於 '3'。

//演員[@id < = 3]

選擇 '歌手' 節點的所有子。

/根/富:歌手/ *

選擇文檔中的所有元素。

// *

選擇所有'演員'元素和'歌手'元素。

//演員| //富:歌手

選擇文檔中的第一個元素的名稱。

名(// * 1

選擇第一個 '演員' 元素的 'id' 屬性的數值。 number(//演員1/@ id)

選擇第一個「actor」元素的「id」屬性的字符串表示值。

字符串(//演員1/@ ID)

選擇第一個 '演員' 元素的文本值的長度。

串長度(//演員1 /文本())

選擇第一個「歌手」元件,即沒有命名空間的本地名稱。

本地名(// foo的:歌手1

選擇 '歌手' 元素的數量。

count(// foo:singer) 選擇'歌手'元素的'id'屬性的總和。

總和(//富:歌手/ @ ID)

0

這是我的想法(不測試)!給出的表達式評估爲布爾值,而不是節點集。

試試這個:

XmlNode test = root.SelectNodes("//moon_phase/")[0]; 

或者

XmlNode test = root.SelectNodes("//moon_phase[yourAttribute='something']") ; 
+0

我已經嘗試過這一點。它不起作用 – Ram

+0

我剛更新我的答案,所以再試一次。希望 – HICURIN

1

嘗試

GoogleXMLdoc.SelectSingleNode("//moon_phase[0]"); 
+0

+1首先正確回答 – Ram