2017-12-16 1 views
0

Mein Wissen über die Verwendung von XML in der Anwendung ist sehr einfach, ich suchte auch nach vielen Posts für diese, aber ich konnte nicht finden, was ich suche.XML-Abfrage zu DataGridView mit XDocument in C#

Ich versuche, eine Anwendung zu machen, wo der Benutzer eine XML-Datei erhält, um es in einen bestimmten Ordner zu legen, und die Anwendung liest ihre Daten und bindet sie an ein DataGridView (DGV).

Meine XML-Datei ist wie folgt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Project> 

    <PCode>18-01</PCode> 
    <PName>Project A</PName> 

    <AllBOQ> 

     <BOQ Division="Mechanical"> 
     <Items> 
      <Item> 
      <Code>M-FF-01</Code> 
      <Description>Supply and Install of Seamless Black Steel Pipes, Sch. 40, 1"</Description> 
      <Quantity>50</Quantity> 
      <Unit>mt</Unit> 
      </Item> 
      <Item> 
      <Code>M-FF-02</Code> 
      <Description>Supply and Install of Seamless Black Steel Pipes, Sch. 40, 2"</Description> 
      <Quantity>60</Quantity> 
      <Unit>mt</Unit> 
      </Item> 
     </Items> 
     </BOQ> 

     <BOQ Division="Electrical"> 
      <Items> 
       <Item> 
       <Code>E-FA-01</Code> 
       <Description>Supply and Install of Fire Alarm</Description> 
       <Quantity>15</Quantity> 
       <Unit>nr</Unit> 
       </Item> 
     </Items> 
     </BOQ> 

    </AllBOQ> 

</Project> 

Die Anwendung sollte Dann bevölkert mit der folgenden Reihenfolge "Code", "Beschreibung", "Menge", "Einheit" 4 Spalten in der DGV erstellen sie mit Daten unter Verwendung dieser Abfrage

private void lbxDivision_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     // Get selected project XML file 
     string selCode = lbxProjects.SelectedValue.ToString(); 
     lblTest.Text = lbxDivision.Text; 
     var boqItems = from itm in selProject.Descendants("BOQ") 
         where itm.Attribute("Division").Value == lbxDivision.Text 
         select new BOQItem() 
         { 
          Code  = itm.Elements("Items").Elements("Item").Elements("Code")  .FirstOrDefault().Value, 
          Description = itm.Elements("Items").Elements("Item").Elements("Description").FirstOrDefault().Value, 
          Quantity = itm.Elements("Items").Elements("Item").Elements("Quantity") .FirstOrDefault().Value, 
          Unit  = itm.Elements("Items").Elements("Item").Elements("Unit")  .FirstOrDefault().Value 
         }; 
     dataGridView1.DataSource = boqItems.ToList(); 

    } 

Die DGV schafft die 4 Säulen aber seine besiedelten mit einer Reihe von Daten nur trotz dieser <BOQ Division="Mechanical"> haben 2 Artikel

Wie abfragen ich alle Elemente unter (Code, Beschreibung, Menge, Einheit), die BOQ Abteilung Attribut = "Mechanical" (oder entsprechend der Benutzerauswahl) haben

Antwort

1

Versuchen Sie, diese

 var items = selProject.Descendants("BOQ") 
           .Where(boq => boq.Attribute("Division").Value == lbxDivision.Text) 
           .Descendants("Item") 
           .Select(itm => new BOQItem() 
           { 
            Code  = itm.Elements("Code")  .FirstOrDefault().Value, 
            Description = itm.Elements("Description").FirstOrDefault().Value, 
            Quantity = itm.Elements("Quantity") .FirstOrDefault().Value, 
            Unit  = itm.Elements("Unit")  .FirstOrDefault().Value 
           }).ToList(); 
+0

Was! ! genau so. Vielen Dank. Möchten Sie Ihren Code erklären? – Tima

+1

Es tut mir leid;). Ihre Auswahl wurde nur einmal pro Definition und nicht pro Artikel ausgeführt. Das ist der Grund, warum du nur einen Gegenstand erhalten hast, statt zwei. Im obigen Code siehst du die Nachkommen ("Item"), also bekommst du jedes Item der Division. – pr177

+0

Ich sehe, warum wir 2 Lambda-Ausdruck "boq" und "itm" benötigt – Tima