Autor Beitrag
schickmaster
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 06.02.12 11:53 
hi,
ich habe folgendes XML file
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<test_db>
  <test>
    <indexnr>2</indexnr>
    <text>so jung kommen wir nimmer zusammen</text>   
    <tags>jung</tags>
    <tags>anstoßen</tags>
    
 </test>
</test_db>


und will es auf <tags> gesucht auslesen, was auch soweit funktioniert, nur das ich nur auf dem ersten Tag matchen kann
der code ist wie folgt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  XElement root = XElement.Load("C:\\...fpad...");
         
          IEnumerable<XElement> test_db =
          from el in root.Elements("test")         
          where (string)el.Element("tags") == "jung" // hier soll es auch mit "anstoßen" funktionieren
          select el;
          
          foreach (XElement el in test_db)
          Console.WriteLine((string)el.Element("text"));
          
      }

ich bekomme den text nur ausgegeben, wenn der code auf den ersten tag matched, auf den zweiten funktioniert es leider nicht.
gibt es hier eine möglichkeit nach allen tags zu matchen, sodass ich bei vergleich mit "jung" und "anstoßen" beide mal den text "so jung kommen wir nimmer zusammen"
ausgegeben bekomme(spruch nur zu testen;D) bin leider grade am verzweifeln, kann doch so wild nicht sein.
für hilfe sehr dankbar.
lg alex


Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mo 06.02.2012 um 11:18
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 06.02.12 12:32 
Hallo alex,

du mußt auch in der where-Bedingung auf el.Elements("tags") zugreifen (beachte die Mehrzahl!), d.h. z.B. mittels der IEnumerable<T>.Contains-Methode.
Eine ähnliche Anfrage habe ich unter Alle "Oberkategorien" vom XML ausgeben beantwortet.
schickmaster Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 09.02.12 16:21 
Hi Th69,
danke für die Antwort.

versuche jetzt schon länger die Contains Methode zum laufen zubekommen. Bei einer normalen Liste geht es auch.
Deinen Vorschlag habe ich versuch so umzusetzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 XElement doc = XElement.Load(xmlpath);
               IEnumerable<XElement> test_db =
               
                  from el in doc.Elements("test")
                  where el.Elements("tag").Contains(, "suchwort")    == true //???            
                  select el;

               foreach (XElement el in test_db)
                   Console.WriteLine((string)el.Element("text"));


Bei Contains(x,y) verlangt er noch einen ersten Wert, bekomme es ber nicht zum laufen und für in der where klausel bekommen ich den Fehler "Delegat "System.Func<System.Xml.Linq.XElement,int,bool>" nimmt keine 1-Argumente an." ODer muss ich vorher eigens eine Liste definieren auf die ich dann Contains anwenden dann? Bei normalen Listen funktioniert Contains auch ohne Probleme, nur scheint es sich mit "where" nicht zu verstehen.

Gruss Alexander
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 09.02.12 17:58 
Hallo,

probiere mal
ausblenden C#-Quelltext
1:
where el.Elements("tags").Any(x => x.Value == "suchwort")					

(Contains geht hier ja nicht, da XElement nicht direkt mit einem String verglichen werden kann).
schickmaster Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 13.02.12 11:34 
Hi Th69,

vielen Dank für die Hilfe, so hat es funktioniert. Komisch, dass ich beim googlen nicht auf Any gestoßen bin.
Lg Alex