XDocument извлекает XML-данные с теми же элементами, но разными атрибутами

#c# #xml

Вопрос:

Итак, у меня есть XML-документ, который структурирован примерно так:

 <product version="1.7">
        <forecast>
                <area type="location">
                        <forecast-period index="0">
                                <element type="air_temperate_minimum" units="Celsius">5</element>
                                <element type="air_temperate_maximum" units="Celsius">10</element>
                                <text type="forecast">Lorem ipsum dolor sit amet</text>
                                <text type="probability_of_precipitation">5%</text>
                        </forecast-period>
                        <forecast-period index="1">
                                <element type="air_temperate_minimum" units="Celsius">10</element>
                                <element type="air_temperate_maximum" units="Celsius">15</element>
                                <text type="forecast">Lorem ipsum dolor sit amet</text>
                                <text type="probability_of_precipitation">10%</text>
                        </forecast-period>
                        <forecast-period index="2">
                                <element type="air_temperate_minimum" units="Celsius">15</element>
                                <element type="air_temperate_maximum" units="Celsius">20</element>
                                <text type="forecast">Lorem ipsum dolor sit amet</text>
                                <text type="probability_of_precipitation">15%</text>
                        </forecast-period>
                        <forecast-period index="3">
                                <element type="air_temperate_minimum" units="Celsius">20</element>
                                <element type="air_temperate_maximum" units="Celsius">25</element>
                                <text type="forecast">Lorem ipsum dolor sit amet</text>
                                <text type="probability_of_precipitation">20%</text>
                        </forecast-period>
                </area>
        </forecast>
</product>
 

Это был код, который я пытался использовать:

 XmlUrlResolver res = new XmlUrlResolver();
XmlReaderSettings set = new XmlReaderSettings();
set.XmlResolver = res;
XDocument doc = XDocument.Load(XmlReader.Create("ftp://ftp.website/file.xml", set));

IEnumerable<XElement> forecast = doc.Descendants("forecast-period");
foreach (XElement element in forecast)
{
    Console.WriteLine(element.Value);
}
 

То, что я пытаюсь сделать, это что-то вроде

 Console.WriteLine(Index1TemperatureMinimum);
 

и возвращаю 10

или

 Console.WriteLine(Index3ProbabilityOfPrecipitation);
 

и возвращение 20%

Спасибо

Комментарии:

1. Вы читали какую-нибудь документацию ? Там приведено довольно много примеров, в том числе о том, как находить элементы по значению атрибута .

2. Неясно, каковы ваши желаемые выходные данные на основе образца XML. Пожалуйста, уточните.

Ответ №1:

См. Следующее :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> locations = doc.Descendants("area").Where(x => (string)x.Attribute("type") == "location").ToList();

            List<Forecast> forecasts = locations.SelectMany(x => x.Descendants("forecast-period").Select(y => new Forecast()
            {
                index = (int)y.Attribute("index"),
                minTemp = y.Elements("element").Where(z => (string)z.Attribute("type") == "air_temperate_minimum").Select(z => (int?)z).FirstOrDefault(),
                maxTemp = y.Elements("element").Where(z => (string)z.Attribute("type") == "air_temperate_maximum").Select(z => (int?)z).FirstOrDefault(),
                forecast = y.Elements("text").Where(z => (string)z.Attribute("type") == "forecast").Select(z => (string)z).FirstOrDefault(),
                precipitation = y.Elements("text").Where(z => (string)z.Attribute("type") == "probability_of_precipitation").Select(z => (x == null) ? null : (int?)int.Parse(((string)z).Substring(0, ((string)z).Length - 1))).FirstOrDefault()
            })).ToList();
        }
    }
    public class Forecast
    {
        public int? index { get; set; }
        public int? minTemp { get; set; }
        public int? maxTemp { get; set; }
        public string forecast { get; set; }
        public int? precipitation { get; set; }

    }

}
 

Комментарии:

1. как вы утешаете. writeline, чтобы получить значение mintemp в индексе 1?

2. int minTemp = прогнозы. Где(x => x.индекс == 1).Первый().минТемп;

3. Я продолжаю получать «Значение не может быть нулевым. Имя параметра: атрибут» Интересно, почему?

4. Ой, я забыл упомянуть, что были и другие элементы для области. Я думаю, что если это специфично для <тип области=»местоположение»>, это исправит это?