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