簡體   English   中英

Linq對XML的條件輸出

[英]Conditional Output by Linq to XML

下面是我嘗試使用Linq to XML讀取的示例XML:

<root>
  <Employee>
    <Name>Jeff</Name>
    <Department>Account</Department>
  </Employee>
  <Employee>
    <Name>David</Name>
    <Department>Finance</Department>
  </Employee>
  <Employee>
    <Name>Neil</Name>
    <Department>Sales</Department>
  </Employee>
  <Employee>
    <Name>Jason</Name>
    <Department>Retail</Department>
  </Employee>
</root>

現在,我需要選擇來自“帳戶” Department Employee元素。 如果Account中沒有,那么我需要從Finance選擇Employee元素。 我怎樣才能做到這一點?

作為選項,您可以使用此代碼:

var result = XElement.Parse(xml).Descendants("Employee")
                     .GroupBy(x => x.Element("Department").Value)
                     .OrderByDescending(x=>x.Key=="Account")
                     .FirstOrDefault(x => (x.Key == "Account" && x.Count() > 0) ||
                                           x.Key == "Finance").ToList();

你可以做到這一點,它不是最優雅的方式。 只需使用|| 並采取FirstOrDefault

 var result = doc.Root.Descendants("Employee").
               Where(x => x.Element("Department").Value == "Account" || x.Element("Department").Value == "Finance").
               FirstOrDefault();

結合Linq和XPath你可以這樣做:

var document = XDocument.Load("data.xml").Root;
//Find a Department with a given value and retrieve its Employee parent
string xPath = "//Department[text() = '{0}']/parent::Employee";

//Search for "Account" Department. If nun was found will return null and then
//search for "Finance"
var employee = document.XPathSelectElement(string.Format(xPath, "Account")) ??
               document.XPathSelectElement(string.Format(xPath, "Finance"));

如果您不想使用XPath,那么您可以這樣做:

var employee = (from item in XDocument.Load("data.xml").Descendants("Employee")
                let department = item.Element("Department").Value
                orderby department == "Account" ? 1 :
                        department == "Finance" ? 2 : 3
                select item).FirstOrDefault();

對於這些部門的所有員工:

var employee = (from item in XDocument.Load("data.xml").Descendants("Employee")
                group item by item.Element("Department").Value into grouping
                orderby grouping.Key == "Account" ? 1 :
                        grouping.Key == "Finance" ? 2 : 3
                select grouping.ToList()).FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM