繁体   English   中英

嵌套linq到XML查询

[英]nested linq to XML query

我如何让LINQ循环嵌套的获胜分支? 我想循环sum_sweedensum_japan字段。

这是我的XML结构:

<TheAPI>
  <TheResult>
    <command>booksResults</command>
  </TheResult>
  <TheData>
    <books>
      <book id="101495">
        <coupon_close_date>1366030400</coupon_close_date>
        <coupon_local_close_date>1366012400</coupon_local_close_date>
        <book_status id="1">Published</book_status>
        <book_details>
          <book_detail>
            <author>bnvbnvb</author>
            <publisher>nnbnbn</publisher>           
          </book_detail>
        </book_details>
        <deals_breakdowns>
          <deal_breakdown id="1">
            <winning deal="5">
              <sum_sweeden>715.00</sum_sweeden>
              <sum_japan>715.00</sum_japan>
            </winning>
          </deal_breakdown>
          <deal_breakdown id="2">
            <winning>
              <sum_sweeden>100.00</sum_sweeden>
              <sum_japan>100.00</sum_japan>
            </winning>
          </deal_breakdown>
        </deals_breakdowns>
      </book>
      <book id="101417">
        <coupon_close_date>1387684800</coupon_close_date>
        <coupon_local_close_date>1387666800</coupon_local_close_date>
        <book_status id="1">Published</book_status>
        <book_details>
          <book_detail>
            <author>mn xccx cvx</author>
            <publisher>hjgh hg jghjg</publisher>         
          </book_detail>
        </book_details>
        <deals_breakdowns>
          <deal_breakdown id="1">
            <winning>0</winning>
          </deal_breakdown>
          <deal_breakdown id="2">
            <winning>
              <sum_sweeden >100</sum_sweeden>
              <sum_japan >100</sum_japan>
            </winning>
          </deal_breakdown>
        </deals_breakdowns>
      </book>
  </TheData>
</TheAPI>

我能够使用LINQ成功地将所有book循环播放:

public class ResultsBookData
{
    public decimal couponCloseDate { get; set; }
    public decimal SumSweeden { get; set; }
    public int BookStatusId { get; set; }
    public string BookStatus { get; set; }
    public string Author { get; set; }
    public string Publisher { get; set; }
    public decimal SumJapan { get; set; }              
}

var result = (from node in books.Elements("book")
              select new ResultsBookData()
              {
                  couponCloseDate = node.SafeValueAsInt("coupon_close_date"),
                  SumSweeden = node.SafeValueAsInt("sum_sweeden"),
                  BookStatusId = node.SafeAttAsInt("book_status", "id"),
                  BookStatus = node.SafeValueAsString("book_status"),
                  Author = node.Element("book_details").HasElements ? node.Element("book_details").Element("book_detail").Element("author").Value : null,
                  Publisher = node.Element("book_details").HasElements ? node.Element("book_details").Element("book_detail").Element("publisher").Value : null,      
                  SumSweeden = node.Element("deals_breakdowns").Element("deals_breakdown").Element("winning").SafeValueAsDecimal("sum_sweeden"),      
                  SumJapan = node.Element("deals_breakdowns").Element("deals_breakdown").Element("winning").SafeValueAsDecimal("sum_japan"),
              }).ToList()

首先-在<deals_breakdowns>有几个<deals_breakdown>元素。 因此,您需要使用Elements("deals_breakdown")选择所有它们。 其次-您需要汇总(汇总) <sum_sweeden>元素值,因为您具有SumSweeden属性,该属性期望单个十进制值,而不是十进制集合:

SumSweeden = node.Element("deals_breakdowns")
                 .Elements("deals_breakdown")
                 .Sum(b => b.Element("winning")
                            .SafeValueAsDecimal("sum_sweeden")),

还请记住,您可以安全地将元素强制转换为字符串或某些可为null的类型(bool,int,decimal)。 考虑到这一点,您可以摆脱自定义扩展方法,并使用以下查询:

from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}

结果:

{
   couponCloseDate: 1366030400.0,
   SumSweeden: 815.00,
   BookStatusId: 1,
   BookStatus: "Published",
   Author: "bnvbnvb",
   Publisher: "nnbnbn",
   SumJapan: 815.00      
},
{
   couponCloseDate: 1387684800.0,
   SumSweeden: 100.0,
   BookStatusId: 1,
   BookStatus: "Published",
   Author: "mn xccx cvx",
   Publisher: "hjgh hg jghjg",
   SumJapan: 100.0
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM