Benutzer mit den meisten Antworten
Linq Vergleichsoperatoren bei strings

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
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
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
- Bearbeitet Frederic Luchting Mittwoch, 1. August 2012 15:13
-
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...
-
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
- Bearbeitet Frederic Luchting Mittwoch, 1. August 2012 15:58
-
...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...:(
-
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 -
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