2016-11-03 5 views
4

Im Folgenden finden Sie die XML-Beispiel, die ich versuche, mithilfe von Linq to XML zu lesen:Bedingte Ausgabe von Linq to 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> 

Nun, ich brauche Employee Elemente auszuwählen, die von "Konto" sind Department. Wenn es keine in Account gibt, dann muss ich Employee Element aus Finance auswählen. Wie kann ich das tun?

+3

Haben Sie einen Code schon? – DavidG

Antwort

0

Sie können dies tun, es ist nicht die eleganteste Art und Weise. Verwenden Sie einfach || und FirstOrDefault

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

Linq und XPath nehmen Kombinieren Sie es wie folgt tun:

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")); 

Wenn Sie XPath nicht verwenden wollen, dann können Sie dies tun:

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(); 

Für alle Mitarbeiter dieser Abteilungen:

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(); 
1

Als Option können Sie diesen Code verwenden können:

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();