我想从API中读取XML响应中的数据,即wunderground API for weather forecasting。我使用下面的代码来阅读它。
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 :(得分:4)
如果你想通过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>
选择文档节点
/
选择“根”元素
/根
选择所有'actor'元素,它们是'actors'元素的直接子元素。
/根/男演员/演员
选择所有“歌手”元素,无论他们在文档中的位置如何。
// FOO:歌手
选择'歌手'元素的'id'属性,无论他们在文档中的位置如何。
// FOO:歌手/ @ ID
选择第一个'actor'元素的文本值。
//演员1 /文本()
选择最后一个'actor'元素。
//演员[最后()]
使用他们的位置选择第一个和第二个'actor'元素。
// actor [position()&lt; 3]
选择具有“id”属性的所有“actor”元素。
//演员[@id]
选择'id'属性值为'3'的'actor'元素。
//演员[@ ID = '3']
选择'id'属性值小于或等于'3'的所有'actor'节点。
//演员[@ ID&LT; = 3]
选择'歌手'节点的所有孩子。
/根/富:歌手/ *
选择文档中的所有元素。
// *
选择所有'actor'元素和'singer'元素。
//演员| // FOO:歌手
选择文档中第一个元素的名称。
名(// * 1)
选择第一个'actor'元素的'id'属性的数值。 数(//演员1 / @ id)的
选择第一个'actor'元素的'id'属性的字符串表示形式值。
的字符串(//演员1 / @ id)的
选择第一个'actor'元素的文本值的长度。
的字符串长度(//演员1 /文本())
选择第一个“歌手”元素的本地名称,即没有名称空间。
本地名称(// FOO:歌手1)
选择“歌手”元素的数量。
计数(// FOO:歌手) 选择“歌手”元素的“id”属性的总和。
和(// FOO:歌手/ @ id)的
答案 1 :(得分:1)
尝试
GoogleXMLdoc.SelectSingleNode("//moon_phase[0]");
答案 2 :(得分:0)
这是我的想法(不是测试)!给定的表达式求值为布尔值,而不是节点集。
试试这个:
XmlNode test = root.SelectNodes("//moon_phase/")[0];
或者
XmlNode test = root.SelectNodes("//moon_phase[yourAttribute='something']") ;