none
Optimierte LinQ Abfrage RRS feed

  • 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
    Sonntag, 29. Oktober 2017 12:31

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. :)

    Montag, 30. Oktober 2017 23:32

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 XML

    Gruß,

    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.

    Montag, 30. Oktober 2017 12:04
    Administrator
  • 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 = High

    Grüße Oliver


    Montag, 30. Oktober 2017 17:24
  • 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. :)

    Montag, 30. Oktober 2017 23:32
  • Hallo Flogex,

    super, passt und Danke.

    Grüße Oliver

    Dienstag, 31. Oktober 2017 09:28