none
Linq Vergleichsoperatoren bei strings RRS feed

  • Frage

  • Hallo an Alle,

    laut Literaturangaben sind in der where Klausel ganz normale Vergleichsoperatoren gültig. Bsp.:

    where(int)artikel.Element("ArtikelNr") > 5

    Das funktioniert hervorragend. Eklig wird es jedoch scheinbar bei strings.

    1. Versuch:

    Filme = XElement.Load(@"C:\Users\Ich\Filmarchiv\Daten\XMLFilme.xml"); XElement Abfrage = from f in Filme.Elements() where f.Element("Titel") == "Figth Club"
    //Fehlermeldung: Operator '==' kann nicht für Strings verwendet werden select f;

    2. und 3. Versuch:

    //bei 
    where f.Element("Titel").ToString() == "Figth Club" 
    //oder 
    where f.Element("Titel").ToString().Contains("Figth Club") 
    //Fehlermeldung: eine implizite Konvertierung ist wegen bereits expliziter nicht möglich

    und beim Versuch mit

    where (string) f.Element("Titel") == "Figth Club"
    select  f;
    // wird 'Abfrage' mit folgender Fehlermeldung markiert: Syntaxfehler. "]" erwartet.

    Frage:
    Ja, wie kann man denn nun nach ganz bestimmten Zeichenketten (Attributwerten) auswählen lassen? Bin einigermaßen ratlos und würde mich über jede Hilfe freuen!

    Besten Dank schonmal im voraus!

    Ralf

    • Bearbeitet Ralf A Mittwoch, 1. August 2012 15:01
    Mittwoch, 1. August 2012 14:56

Antworten

  • Hallo Jürgen,

    Du hattest absolut Recht. Es war die Struktur der xml - Datei. ich hatte statt

    <wurzel>
               <knoten>       
                        <kindknoten>
                        </kindknoten>
              </knoten>
    </wurzel>

    nur eine Tiefe von 2 Ebenen. Also keinen Kindknoten. Das konnte nicht gehren.

    Nochmals besten Dank an Euch beide!

    Ralf

    • Als Antwort markiert Ralf A Donnerstag, 2. August 2012 09:14
    Donnerstag, 2. August 2012 09:13

Alle Antworten

  • Hallo Ralf,

    probier mal

        var Filme = XElement.Load(@"C:\Users\Ich\Filmarchiv\Daten\XMLFilme.xml");
        IEnumerable<XElement> Abfrage = from f in Filme.Elements()
                        where f.Element("Titel").Value == "Figth Club"
                        select f;

    Der Rückgabetype ist also ein IEnumerable<XElement> da ja mehrere vorkommen können (oder schreib einfach var) und für den Stringvergleich fehlt noch die .Value Eigenschaft.

    (und es heißt "Fight Club" falls du trotzdem keine Treffer bekommst :-)

    Frederic


    Mittwoch, 1. August 2012 15:12
  • Hi Frederic,

    Danke für Deine schnelle Antwort. Habe es gerade (inkl. Rechtschreibfehlerkorrektur) ausprobiert.

    Die Mssgbox gibt folgendes aus:

    base {System.Linq.Enumerable.Iterator<System.Xml.Linq.XElement>} = {System.Linq.Enumerable.WhereEnumerableIterator<System.Xml.Linq.XElement>}

    Es ist noch nicht ganz das, was ich mir vorgestellt habe. Es scheint aber der richtige Weg zu sein, denn immerhin gibt es keine Fehlermeldungern mehr...

    Mittwoch, 1. August 2012 15:33
  • Hallo Ralf,

    ich weiß ja nicht, was du in der Messagebox ausgibst aber wahrscheinlich fehlt wieder ein .Value. Also habe ich mir ein Beispiel-xml gebastelt und eine kleine Consolenanwendung die zeigt, wie man Elemente filtert und und dann werte ausgibt:

    <?xml version="1.0" encoding="utf-8" ?>
    <Filme>
        <Film>
            <Titel>Fight Club</Titel>
            <Dauer>190</Dauer>
        </Film>
        <Film>
            <Titel>Bittermoon</Titel>
            <Dauer>120</Dauer>
        </Film>
    </Filme>

                var Filme = XElement.Load("Filme.xml");
                IEnumerable<XElement> Abfrage = from f in Filme.Elements("Film")
                                                where  f.Element("Titel").Value == "Fight Club"
                                                select f;
                foreach(XElement film in Abfrage)
                {
                    Console.WriteLine("Filmtitel: {0}, Dauer: {1}", film.Element("Titel").Value, film.Element("Dauer").Value);
                }
                Console.ReadLine();

    Frederic


    Mittwoch, 1. August 2012 15:56
  • ...ach Frederic... keine Ahnung was Du richtig machst...;)

    so sehr viel anders sieht es bei mir ja auch nicht aus...

    var Filme = XElement.Load(@"C:\Users\Ich\Filmarchiv\Daten\XMLFilme.xml"); 
    
    IEnumerable<XElement> Abfrage = from f in Filme.Elements("Film") where f.Element("Titel").Value == "Fight Club" select f; 
    
    string test = ""; 
    
    foreach (XElement film in Abfrage) 
    { test += "Filmtitel: " + film.Element("Titel").Value + " Inhalt: " + film.Element("Inhalt").Value; } 
    
    System.Windows.Forms.MessageBox.Show(test);

    der Pfad stimmt, die Struktur stimmt, selbst ie Rechtschreibung...aber die Variable test bleibt leer...:(

    Mittwoch, 1. August 2012 16:43
  • Hi,

    wenn die Variable leer bleibt, ist wohl doch nicht alles gleich. Vielleicht postest Du mal (zumindest auszugsweise) Deine XML-Datei oder Du schreibst Frederics Daten in die zu öffnende XML-Datei (und lässt Deine "Inhalt"-Ausgabe weg).

    Gruß
    Jürgen

    Mittwoch, 1. August 2012 18:14
  • Hallo Jürgen,

    Du hattest absolut Recht. Es war die Struktur der xml - Datei. ich hatte statt

    <wurzel>
               <knoten>       
                        <kindknoten>
                        </kindknoten>
              </knoten>
    </wurzel>

    nur eine Tiefe von 2 Ebenen. Also keinen Kindknoten. Das konnte nicht gehren.

    Nochmals besten Dank an Euch beide!

    Ralf

    • Als Antwort markiert Ralf A Donnerstag, 2. August 2012 09:14
    Donnerstag, 2. August 2012 09:13