2017-07-18 1 views
0

Hallo ich habe Probleme, meine foreach zur Arbeit zu bekommen. Es wählt nur einen Knoten in meiner simpel linq Abfrage aus. Ich actly nicht, was das Problem ist, weil ich benutze Xmldocument und XMLNodelist verwenden. Aber ich möchte wirklich lernen, es mit Linq zu tun, ich kann nichts bei Google finden, warum es nicht funktioniert, ich versuche auch die Expamales auf diesen Links.Linq zu xml foreach funktioniert nicht

http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples

Simple LINQ to XML is not working

https://forums.asp.net/t/1378244.aspx?Linq+to+XML+query+how+to+get+all+elements+but+excluding+some+

http://www.c-sharpcorner.com/UploadFile/de41d6/learning-linq-made-easy-linq-to-xml-tutorial-3/

Beide diese Beispiele nur zurückkehren, ein XML-Knoten.

XElement ele = XElement.Load(filePath); 
String aXmlString = ele.ToString(SaveOptions.DisableFormatting) + ele.Value; 

foreach (XElement xNode in ele.Descendants("lakeringsdel")) 
{ 
    //litTest.Text = xNode.Element("lakeringsMetode").Value; 

    strData = "<table style='width:100%;' >" 
     + "<tr>" 
     + "<th>Nr.</th>" 
     + "<th>Arbejdsbeskrivelse/Omfang</th>" 
     + "<th>Metode</th>" 
     + "<th>Ae</th>" 
     + "</tr>" 
     + "<tr>" 
     + "<td>" + xNode.Element("ledenr").Value + "</td>" 
     + "<td>" + xNode.Element("lakeringsDel").Value + "</td> " 
     + "<td>" + xNode.Element("lakeringsMetode").Value + "</td> " 
     + "<td>" + xNode.Element("arbejdsEnheder").Value + "</td> " 
     + "</tr>" 
     + 
     "</table>"; 
} 

nächste Beispiel

var test = ""; 
var q = from c in ele.Descendants("lakeringsdel") 
     select c.Element("lakeringsDel").Value; 

foreach (string item in q) 
{ 
    test = item; 
} 

Meine XML-Dokument

<lakRapportDetaljer> 
    <aePrTime>10</aePrTime> 
    <fabrikatModelTekst>FORD FOCUS (CEW)</fabrikatModelTekst> 
    <kilometerStand>28205</kilometerStand> 
    <lakArbejde>2745.0</lakArbejde> 
    <lakIaltTotal>3610.05</lakIaltTotal> 
    <lakIndex>134</lakIndex> 
    <lakMaterialer>865.05</lakMaterialer> 
    <lakTimepris>450.0</lakTimepris> 
    <lakeringsMetode>2-LAGS METALLIC</lakeringsMetode> 
    <lakeringsMetode>DØRGREB LEVERES LAKE</lakeringsMetode> 
    <lakeringsdel> 
     <arbejdsEnheder>10.0</arbejdsEnheder> 
     <lakeringsDel>KOFANGER H B</lakeringsDel> 
     <lakeringsMetode>REPARATION LAK.PLAST</lakeringsMetode> 
     <ledenr>2584</ledenr> 
    </lakeringsdel> 
    <lakeringsdel> 
     <arbejdsEnheder>15.0</arbejdsEnheder> 
     <lakeringsDel>BAGSKÆRM HØJRE</lakeringsDel> 
     <lakeringsMetode>REP.LAK. &amp;lt;50%, METAL</lakeringsMetode> 
     <ledenr>3482</ledenr> 
    </lakeringsdel> 
    <lakeringsdel> 
     <arbejdsEnheder>5.0</arbejdsEnheder> 
     <lakeringsDel>SPECIALAFDÆKNING</lakeringsDel> 
     <lakeringsMetode>OVERFLADE LAKERING</lakeringsMetode> 
     <ledenr>1000</ledenr> 
    </lakeringsdel> 
    <miljoeLakMaterialerProcent>6</miljoeLakMaterialerProcent> 
</lakRapportDetaljer> 
+1

Ihre Zeichenfolge im Beispielcode enthält das letzte Iterationsergebnis. Vielleicht möchtest du es oder etwas anhängen. – Reniuz

+0

Auch müssen Sie die Werte, die Sie verwenden, um Ihre Zeichenfolge zu erstellen, entkommen, wenn ledenr, lakeringsDel, lakeringsMetode oder arbejdsEnheder ein & oder Sprotty

+0

Siehe auch https://StackOverflow.com/questions/341872/html-sanitizer-for-net – Sprotty

Antwort

0

ich Ihren Code getestet haben, aber ich kann kein Problem sehen: es gibt drei Knoten : xml example

, wenn Sie alle Elemente innerhalb des 3 XElement Knoten "lakeringsdel" auswählen möchten, können Sie tun:

var q = from c in ele.Descendants("lakeringsdel") 
       select c; 

     foreach (XElement item in q) 
     { 
      test = item.Value; 
     } 

die gibt: xml example 2

oder direkt:

var q = ele.Descendants("lakeringsdel"); 


     foreach (XElement item in q) 
     { 
      test = item.Value; 
     } 

die gibt das gleiche Ergebnis

oder in 1 Zeile:

ele.Descendants("lakeringsdel").ToList().ForEach(elem=>test =elem.Value); 

aber wie gesagt Reniuz in Kommentar: Sie speichern nur das letzte Ergebnis in Ihrem "test" Variable

, wenn Sie alle Ergebnisse speichern möchten Sie tun könnten:

List<string> test = new List<string>(); 
var q = from c in ele.Descendants("lakeringsdel") 
       select c.Element("lakeringsDel").Value; 

     foreach (string item in q) 
     { 
      test.Add(item); 
     } 

oder in 1 Leitung:

test.AddRange(q); 
+0

Vielen Dank, es hat mir so viel geholfen :) –

1

In beiden Beispielen stellen Sie den Ausgang strData und test jedes Mal, wenn Sie eine Schleife durch Ihre Artikel. Dies führt dazu, dass nur der letzte Eintrag in Ihrer Liste bearbeitet wird.

Angenommen, Sie eine Tabelle mit den Ergebnissen auf Ihrer Homepage zeigen wollen, sollten Sie Ihr erstes Beispiel dieser ich eine StringBuilder Verwendung empfehlen

XElement ele = XElement.Load(filePath); 
String aXmlString = ele.ToString(SaveOptions.DisableFormatting) + ele.Value; 

strData = "<table style='width:100%;' >" 
     + "<tr>" 
     + "<th>Nr.</th>" 
     + "<th>Arbejdsbeskrivelse/Omfang</th>" 
     + "<th>Metode</th>" 
     + "<th>Ae</th>" 
     + "</tr>" 

foreach (XElement xNode in ele.Descendants("lakeringsdel")) 
{ 
    //litTest.Text = xNode.Element("lakeringsMetode").Value; 

    strData += "<tr>" 
     + "<td>" + xNode.Element("ledenr").Value + "</td>" 
     + "<td>" + xNode.Element("lakeringsDel").Value + "</td> " 
     + "<td>" + xNode.Element("lakeringsMetode").Value + "</td> " 
     + "<td>" + xNode.Element("arbejdsEnheder").Value + "</td> " 
     + "</tr>";   
} 

strData += "</table>"; 

ändern die Zeichenfolge statt + zu bauen; das könnte wie dieses Beispiel aussehen.

StringBuilder strData = new StringBuilder("<table style='width:100%;'>"); 
strData.AppendLine("<tr>"); 
strData.AppendLine("<th>Nr.</th>"); 
+0

thx ich weiß über sb, ich wusste nicht, dass es so viel schneller war. Danke :) –

+0

Ihre Begrüßung :-) –