Benutzer mit den meisten Antworten
Optimierte LinQ Abfrage

Frage
-
Hallo,
ich muss in einer XML Datei das Element VARIABLE herauslesen.
Das ganz ist etwas verschachtelt
* VARIANT_001
* VARIANT_002
* VARIANT_003").Elements("VARIANT_001").
Wenn das von Knoten zu Knoten anders ist, alles andere wäre gleich. Kann man das einfacher erfragen?
Jede Variante hat aber das Element VARIABLE.
Funktioniert, denke jedoch, dass ich das nicht optimal gelöst habe.
Welche Abfrage würde sich hier besser eignen?// -------------- VERSUCH 1, hier müßte ich alle Möglichkeiten durchlaufen var qry1 = docLabel.Root.Element("LABEL").Element("OBJECTS").Elements("VARIANT_001").Select(item => item.Element("VARIABLE").Attribute("value").Value).Distinct().ToList(); var qry2 = docLabel.Root.Element("LABEL").Element("OBJECTS").Elements("VARIANT_002").Select(item => item.Element("VARIABLE").Attribute("value").Value).Distinct().ToList(); var qry3 = docLabel.Root.Edddddlement("LABEL").Element("OBJECTS").Elements("VARIANT_003").Select(item => item.Element("VARIABLE").Attribute("value").Value).Distinct().ToList();
// -------------- VERSUCH 2, vielleicht besser List<string> listVariablesText = docLabel.Root.Descendants("VARIANT_001").Select(item => item.Element("VARIABLE").Attribute("value").Value).Distinct().ToList(); List<string> listVariables = docLabel.Root.Descendants("VARIANT_003").Select(item => item.Element("VARIABLE").Attribute("value").Value).Distinct().ToList();
Grüße Oliver
Antworten
-
Hey,
var variables = xDocument.Descendants("VARIABLE") .Select(item => item.Attribute("value").Value).ToList(); var keyValuePairs = doc.Descendants("VARIABLE") .ToDictionary(item => item.Parent.Name.ToString(), item => item.Attribute("value").Value);
Mit deiner Beispieldatei enthält variables die Werte "Length", "Width" und "High".
keyValuePairs ist ein Dictionary mit folgenden Werten: (VARIANT_001, Length); (VARIANT_002, Width); (VARIANT_003, High).Descendants durchsucht alle Nachfahren, also auch Kindeskinder und Kinder der Kindeskinder usw. Also findest du alle Vorkommen von "VARIABLE", die hierarchisch unter dem ausgewählten Knoten liegen.
Im ersten Fall werden die Elemente mit Select auf den Wert des Attributs value abgebildet. Im zweiten Fall erstelle ich das von dir beschriebene Dictionary aus VARIANT_xxx und value
Beste Grüße.
Vergiss nicht, die Antwort auf deine Frage zu markieren und hilfreiche Beiträge zu bewerten, damit auch andere schnell die Lösung für ihr Problem finden können - und wir nebenbei noch ein paar Punkte verdienen. :)
- Als Antwort markiert Oliver Müller12 Dienstag, 31. Oktober 2017 09:28
Alle Antworten
-
Hallo Oliver,
Kannst Du einen Auszug aus der XML-Datei veröffentlichen? Zum Beispiel, wenn Du bestimmte Elemente finden möchtest, hast Du zwei Optionen - Elements und Descendants - aber es gibt einen wichtigen Unterschied zwischen diesen beiden. Sieh Dir diesen Thread an:
Descendants vs. Elements in Linq to XMLGruß,
Ivan Dragov
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo Ivan,
ja Danke.
Anbei ein Beispielfile.<ROOT> <LABEL> <NAME value="0783422" /> <OBJECTS> <VARIANT_001> <VALUE value="1234" /> <VARIABLE value="Length" /> <Unit value="mm" /> </VARIANT_001> <VARIANT_002> <VALUE value="AASA" /> <VARIABLE value="Width" /> <VERIFY value="1" /> </VARIANT_002> <VARIANT_003> <VARIABLE value="High" /> </VARIANT_003> </OBJECTS> </LABEL>
</ROOT>
Ziel ist es die Variablen in einer String Liste zu haben.Oder Alternativ Key Value Dictionary.
VARIANT_003 = HighGrüße Oliver
- Bearbeitet Oliver Müller12 Montag, 30. Oktober 2017 18:22
-
Hey,
var variables = xDocument.Descendants("VARIABLE") .Select(item => item.Attribute("value").Value).ToList(); var keyValuePairs = doc.Descendants("VARIABLE") .ToDictionary(item => item.Parent.Name.ToString(), item => item.Attribute("value").Value);
Mit deiner Beispieldatei enthält variables die Werte "Length", "Width" und "High".
keyValuePairs ist ein Dictionary mit folgenden Werten: (VARIANT_001, Length); (VARIANT_002, Width); (VARIANT_003, High).Descendants durchsucht alle Nachfahren, also auch Kindeskinder und Kinder der Kindeskinder usw. Also findest du alle Vorkommen von "VARIABLE", die hierarchisch unter dem ausgewählten Knoten liegen.
Im ersten Fall werden die Elemente mit Select auf den Wert des Attributs value abgebildet. Im zweiten Fall erstelle ich das von dir beschriebene Dictionary aus VARIANT_xxx und value
Beste Grüße.
Vergiss nicht, die Antwort auf deine Frage zu markieren und hilfreiche Beiträge zu bewerten, damit auch andere schnell die Lösung für ihr Problem finden können - und wir nebenbei noch ein paar Punkte verdienen. :)
- Als Antwort markiert Oliver Müller12 Dienstag, 31. Oktober 2017 09:28