Как выбрать один узел из документа XML?

Я хочу читать данные из ответа XML от API, т.е. wunderground API для прогнозирования погоды. Я использовал приведенный ниже код, чтобы прочитать его.

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 ответа

Когда вы захотите получить xml через xpath, вы должны получить следующее:

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>

Смотрите этот сайт:

<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>

Выберите узел документа

/

Выберите элемент "root"

/корень

Выберите все элементы "актера", которые являются прямыми дочерними элементами элемента "актеры".

/Корень/актеры/актер

Выберите все элементы "певицы" независимо от их позиций в документе.

//Foo: певица

Выберите атрибуты "id" элементов "певица", независимо от их позиций в документе.

//Foo: певец/@идентификатор

Выберите текстовое значение первого элемента "actor".

//actor 1/text()

Выберите последний элемент "actor".

//актер [последняя()]

Выберите первый и второй элементы "актера", используя свою позицию.

//actor [position() <3]

Выберите все элементы "actor", которые имеют атрибут "id".

//актер [@id]

Выберите элемент "actor" с атрибутом "id" атрибута "3".

//актер [@ID = '3']

Выберите все "актерские" узлы, значение атрибута "id" будет меньше или равно "3".

//актер [@id <= 3]

Выберите всех детей узла "певцов".

/Корень/Foo: певцы /*

Выберите все элементы документа.

//*

Выберите все элементы "actor" и элементы "певицы".

//актер |//Foo: певица

Выберите имя первого элемента в документе.

name (//* 1)

Выберите числовое значение атрибута "id" первого элемента "actor". number (//actor 1/@id)

Выберите значение строкового представления атрибута "id" первого элемента "actor".

string (//actor 1/@id)

Выберите длину первого текстового значения элемента "actor".

string-length (//actor 1/text())

Выберите локальное имя первого элемента 'singer', т.е. Без пространства имен.

local-name (//foo: певец 1)

Выберите количество элементов "певица".

count (//foo: singer) Выберите сумму атрибутов 'id' элементов 'singer'.

сумма (//Foo: певец/@идентификатор)


Пытаться

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


Это моя идея (не тест)! Выраженное выражение оценивается как логическое, а не набор узлов.

Попробуй это:

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

Или

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

licensed under cc by-sa 3.0 with attribution.