С# XmlDocument выбирает узлы, возвращая пустые

я пытаюсь работать с http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554 XML. Допустим, я хочу выбрать все атрибуты значений каждого элемента температуры.

я пробовал это.

        const string url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554";
        WebClient client = new WebClient();
        string x = client.DownloadString(url);
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(x);

        XmlNodeList nodes = xml.SelectNodes("/weatherdata/product/time/location/temperature");
        //XmlNodeList nodes = xml.SelectNodes("temperature");

        foreach (XmlNode node in nodes)
        {                
            Console.WriteLine(node.Attributes[0].Value);
        }

Но я все время ничего не получаю. Что я делаю неправильно?


person gygabyte    schedule 15.12.2016    source источник
comment
так что, вероятно, этой заметки нет в вашем документе. Также используйте XDocument   -  person mybirthname    schedule 15.12.2016
comment
Он существует. Я должен использовать класс XmlDocument. Я должен сделать это для школьного проекта, и это необходимо указать.   -  person gygabyte    schedule 15.12.2016


Ответы (2)


Текущая одиночная косая черта нацелена на данные о погоде под корнем, но корень — это данные о погоде.

Добавьте предыдущую косую черту к вашему запросу xpath, чтобы сделать его двойной косой чертой:

XmlNodeList nodes = xml.SelectNodes("//weatherdata/product/time/location/temperature");

Двойная косая черта указывает xpath выбирать узлы в документе из текущего узла, которые соответствуют выбору, независимо от того, где они находятся.

или удалите предшествующую косую черту:

XmlNodeList nodes = xml.SelectNodes("weatherdata/product/time/location/temperature");

который ищет весь путь, включая корень.

Кроме того, поскольку вы, по-видимому, хотите, чтобы значение, называемое значением, добавило это:

Console.WriteLine(node.Attributes["value"].Value);

Поскольку значение в node.Attributes[0].Value может быть не в том порядке, в котором вы ожидаете.

person br0therDave    schedule 15.12.2016

Вы пытаетесь перебрать каждый атрибут?

foreach (XmlNode node in nodes)
        {
            //You could grab just the value like below
            Console.WriteLine(node.Attributes["value"].Value);

            //or loop through each attribute
            foreach (XmlAttribute f in node.Attributes)
            {
                 Console.WriteLine(f.Value);
            }
        }
person Teddy Higgins    schedule 15.12.2016
comment
Нигде, я думаю. Должен ли я? - person gygabyte; 15.12.2016