XDocument提取具有相同元素但不同属性的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%的

感谢

请参阅以下内容:

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

最新更新