使用LINQ to XML选择最内层后代的子集

本文关键字:后代 子集 LINQ to XML 选择 使用 | 更新日期: 2023-09-27 18:02:33

我有一个类似于

的xml文件
<?xml version="1.0" encoding="utf-8"?>
<client>
  <Customers>
    <Customer>
      <Customer_TIN>ABC</Customer_TIN>
      <Cust_PDR>001</Cust_PDR>
      <CurrentBusinessDate>06-13-2014</CurrentBusinessDate>
      <Facilities>
        <Facility>
          <Cust_External_Id>123</Cust_External_Id>
          <FacilityExpiryDate>2014-06-13</FacilityExpiryDate>
        </Facility>
        <Facility>
          <Cust_External_Id>456</Cust_External_Id>
          <FacilityExpiryDate>2014-06-14</FacilityExpiryDate>
        </Facility>
      </Facilities>
    </Customer>
  </Customers>
</client>

我使用LINQ to XML来选择Customers元素中的数据,但是我只需要包含那些使用FacilityExpiryDate> CurrentBusinessDate的设施。

我可以使用下面的代码在Facility级别找到这个:

(from i in xDoc.Descendants("Facility")
where
     Convert.ToDateTime(i.Element("FacilityExpiryDate").Value) >
          Convert.ToDateTime((from j in xDoc.Descendants("CurrentBusinessDate") 
          select (string)j).First().ToString())
select i).ToList();

但是我想知道是否有可能从客户级别开始解析并得到相同的结果。

使用LINQ to XML选择最内层后代的子集

应该可以:

xDoc.Descendants("Facility")
            .Where(
                x =>
                    (DateTime) x.Element("FacilityExpiryDate") >
                    (DateTime) x.Parent.Parent.Element("CurrentBusinessDate"));

或:

xDoc.Descendants("Customer")
            .SelectMany(
                x =>
                    x.Elements("Facility")
                        .Where(
                            f =>
                                (DateTime) f.Element("FacilityExpiryDate") >
                                (DateTime) x.Element("CurrentBusinessDate")));