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

Ram*_*Ram 0 c# xml asp.net exception

我想从API(即wunderground API)的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/");
     }
//.....
Run Code Online (Sandbox Code Playgroud)

但是我是异常表达式,必须 在代码的最后一行求值到节点集。我尝试了一些解决方案,但无法获取数据。实际上,想要的是:我想确定太阳落山和日出的时间。请帮助我如何解决此问题。

小智 5

当您想通过xpath获取xml时,应获得如下代码:

    XmlNode test = root.SelectSingleNode("//moon_phase/percentIlluminated");
Run Code Online (Sandbox Code Playgroud)

要么

        XmlNode test = root.SelectSingleNode("//moon_phase/*");
Run Code Online (Sandbox Code Playgroud)

要么

GoogleXMLdoc.SelectSingleNode("//moon_phase[0]");
Run Code Online (Sandbox Code Playgroud)

这是您的结果:

<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>
Run Code Online (Sandbox Code Playgroud)

看到这个网站

<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>
Run Code Online (Sandbox Code Playgroud)

选择文档节点

/

选择“根”元素

/根

选择作为“演员”元素直接子代的所有“演员”元素。

/ root / actor / actor

选择所有“歌手”元素,无论它们在文档中的位置如何。

// foo:歌手

选择“歌手”元素的“ id”属性,无论它们在文档中的位置如何。

// foo:歌手/ @ id

选择第一个“ actor”元素的文本值。

//演员1 / text()

选择最后一个“ actor”元素。

// actor [last()]

使用它们的位置选择第一个和第二个“ actor”元素。

// actor [position()<3]

选择所有具有“ id”属性的“演员”元素。

//演员[@id]

选择“ id”属性值为“ 3”的“ actor”元素。

// actor [@ id ='3']

选择“ id”属性值小于或等于“ 3”的所有“ actor”节点。

//演员[@id <= 3]

选择“歌手”节点的所有子级。

/ root / foo:歌手/ *

选择文档中的所有元素。

// *

选择所有“演员”元素和“歌手”元素。

//演员| /// foo:歌手

选择文档中第一个元素的名称。

名称(// * 1

选择第一个“ actor”元素的“ id”属性的数值。编号(//演员1 / @ id)

选择第一个“ actor”元素的“ id”属性的字符串表示值。

字符串(//演员1 / @ id)

选择第一个“ actor”元素的文本值的长度。

字符串长度(// actor 1 / text())

选择第一个“歌手”元素的本地名称,即没有名称空间。

本地名称(// foo:singer 1

选择“歌手”元素的数量。

count(// foo:singer)选择'singer'元素的'id'属性之和。

sum(// foo:歌手/ @ id)