我正在尝试使用linq获取一定价格范围内的XML文件的值范围,我不太确定如何做到这一点,但是我知道如何获取每个Element的价格。 / p>
我试图列出每个元素的价格,然后应用所有范围内的价格,但是我不知道如何保留品牌,因为我必须在价格范围内展示现有汽车的品牌
XML:
<Garage>
<Car id="001">
<Brand>Foo</Brand>
<Price>100</Price>
</Car>
<Car id="002">
<Brand>Bar</Brand>
<Price>130</Price>
</Car>
<Car id="003">
<Brand>Re</Brand>
<Price>110</Price>
</Car>
</Garage>
代码:
var xmlStr = File.ReadAllText(@"C:\Path\To\Xml");
var str = XElement.Parse(xmlStr);
var carInRange = str.Elements("Car").Where(x => x.Element("Price").Value.Equals("100")).ToList();
很明显,我只是获得“ 100”值,但是我希望得到的范围在100到120之间(仅作为示例),但不确定如何做到这一点。
答案 0 :(得分:3)
您可能希望将价格解析为decimal
或其他数字类型。然后,您可以执行范围检查。例如
var carInRange = str.Elements("Car")
.Where(x => decimal.TryParse(x.Element("Price").Value, out decimal price)
&& price < 100m))
.ToList();
答案 1 :(得分:2)
使用XPath怎么样?它比嵌套的linq操作更具可读性:
var carsInRange = xml.XPathSelectElements("/Car[Price > 100 and Price <= 120]");
如果您想继续使用Linq查询,可以尝试
var cars = xml.Elements("Car");
var carsInRange2 = from c in cars
let price = (decimal)c.Element("Price")
where price > 100 && price <= 120
select c;
Console.WriteLine(carsInRange2.Count());
完整样本:
using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
internal class Program
{
private static void Main(string[] args)
{
var data = @"<Garage>
<Car id=""001"">
<Brand>Foo</Brand>
<Price>100</Price>
</Car>
<Car id=""002"">
<Brand>Bar</Brand>
<Price>130</Price>
</Car>
<Car id=""003"">
<Brand>Re</Brand>
<Price>110</Price>
</Car>
</Garage>";
var xml = XElement.Parse(data);
var carsInRange = xml.XPathSelectElements("/Car[Price > 100 and Price <= 120]");
Console.WriteLine(carsInRange.Count());
var cars = xml.Elements("Car");
var carsInRange2 = from c in cars
let price = (decimal)c.Element("Price")
where price > 100 && price <= 120
select c;
Console.WriteLine(carsInRange2.Count());
Console.ReadKey();
}
}