【问题标题】:How to get a range of XML elements that contains certain "price" in C#如何在 C# 中获取包含特定“价格”的一系列 XML 元素
【发布时间】:2019-06-08 21:59:39
【问题描述】:

我正在尝试使用 linq 获取某个价格范围内的 XML 文件的一系列值,我不太确定该怎么做,但我知道如何获取每个元素的价格。

我尝试列出每个元素的价格,然后应用范围内的所有内容,但我不知道如何保留品牌,因为我必须在价格范围内显示现有汽车的品牌.

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 之间的范围(仅作为示例),但不知道该怎么做。

【问题讨论】:

    标签: c# .net xml linq


    【解决方案1】:

    您可能希望将价格解析为decimal 或其他数字类型。然后您可以执行范围检查。例如

    var carInRange = str.Elements("Car")
                         .Where(x => decimal.TryParse(x.Element("Price").Value, out decimal price)
                                     && price < 100m))
                         .ToList();
    

    【讨论】:

    • 正在做我真正需要的,但我想指定最低价格和最高价格,在这种情况下,例如 double minimumPrice=100;双倍最大价格=120;
    • 你可以使用任何你想要的条件表达式。在您的情况下,您可以使用decimal.TryParse(...) &amp;&amp; price &gt;= minimumPrice &amp;&amp; price &lt;= maximumPrice
    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      相关资源
      最近更新 更多