[英]nested linq to XML query
我如何讓LINQ循環嵌套的獲勝分支? 我想循環sum_sweeden
和sum_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.