如何从XML文档中选择单个节点?

时间:2013-12-14 06:50:31

标签: c# asp.net xml exception

我想从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/");
     }
//.....

但我异常表达式必须在代码的最后一行评估为节点集。我尝试了一些解决方案,但我无法获得数据。其实想要的是:我想要获得日落和日出时间。请帮帮我,我该如何解决这个问题。

3 个答案:

答案 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']") ;