如何在C#中获取包含某些“价格”的XML元素范围

时间:2019-01-14 21:39:27

标签: c# .net xml linq

我正在尝试使用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之间(仅作为示例),但不确定如何做到这一点。

2 个答案:

答案 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();
    }
}