LINQ:如何选择子节点满足条件的项元素



我的XML看起来像这样:

 <order>
    <order_number>1N</order_number>
    <execution_data>
        <exe_date>11/01/2011</exe_date>
        <exe_name>Joe</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>12/01/2011</exe_date>
        <exe_name>Mike</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>8/01/2011</exe_date>
        <exe_name>Steve</exe_name>
    </execution_data>
</order>
<order>
    <order_number>2N</order_number>
    <execution_data>
        <exe_date>11/01/2011</exe_date>
        <exe_name>Rob</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>12/01/2011</exe_date>
        <exe_name>Marko</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>8/01/2011</exe_date>
        <exe_name>Sam</exe_name>
    </execution_data>
</order>
<order>
    <order_number>3N</order_number>
    <execution_data>
        <exe_date>11/01/2011</exe_date>
        <exe_name>Nick</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>12/01/2011</exe_date>
        <exe_name>Ashley</exe_name>
    </execution_data>
    <execution_data>
        <exe_date>8/01/2011</exe_date>
        <exe_name>Marc</exe_name>
    </execution_data>
</order>

    public class ExecutionItem
    {
       public string Date {get;set;}
       public string Name {get;set;}
    }
    public class Response
    {
       public List<ExecutionItem> ExecutionItems{get;set;}
    }

如何选择order_number等于1N的订单,然后使用LINQ从该订单中获取所有execution_data

这里有两种方法:

  • 您可以查找值为1N的所有<order_number>元素,然后查找所有同级execution_data元素
  • 您可以找到具有相关order_number元素的order元素,然后找到子execution_data元素

我可能会选择后一种方法,类似于:

var executionDataElements = 
      doc.Descendants("order")
         .Where(order => (string) order.Element("order_number") == "1N")
         .SelectMany(order => order.Elements("execution_data");

(请注意,如果这与多个订单匹配,您将从所有匹配的订单中获得所有元素。)

第一种方法如果您知道execution_data元素在order_number元素之后,并且如果您知道只有一个这样的order_number元素,则为:

var executionDataElements = doc.Descendants("order_number")
                               .First(x => (string) x == "1N")
                               .ElementsAfterSelf("execution_data");

最新更新