2010-11-19 4 views
2
<Results> 
    <ResultSet>"nothing special" Description="More of nothing" 
    <Results> 
     <Result> 
     <Body>Four in this group</Body> 
     <Body2>this is more stuff I want</Body2> 
     <Body3>This is interesting stuff I want</Body3> 
     <Body4>this is more stuff I want</Body4> 
     </Result> 
     <Result> 
     <Something1>Only 3 in the group</Something1> 
     <ID>this is more stuff I want</ID> 
     <Stuff>This is interesting stuff I want</Stuff> 
     </Result> 
     <Result> 
     <Tag1>Only 3 in the group</Tag1> 
     <Tag2>this is more stuff I want</Tag2> 
     <Tag3>This is interesting stuff I want</Tag3> 
     </Result> 
    </Results> 
    </ResultSet> 
</Results> 

Wie würde ich Linq zu XML verwenden, um alle <Result> Blöcke herauszuziehen? Wie Sie sehen können, kann jeder Block eine beliebige Anzahl von Elementen haben und ich werde nicht wissen, wie sie heißen. Mein Endziel ist es, diese Blöcke in Objekte zu verpacken, die ich dann an meiner App weitergeben werde.LINQ To XML - Wie Abfrage für alle Elemente in einem inneren Element?

Das Problem, das ich habe, ist, dass ich nicht jede Gruppe einzeln mit Linq ausbrechen kann. Der nächste, den ich bekommen kann, ist die Rückgabe aller Elemente innerhalb ALLER <Result> Gruppen in eine große Liste (mit Descendants).

Edit: Dies ist der Code, den ich verwende, um alles in jeder <Result> Gruppe zurückzubringen. Ich kann nicht herausfinden, wie man die Liste von dieser Abfrage durchläuft, um die Name/Wert-Paare zu durchbrechen. Ich kenne die Namen der Elemente nicht, daher kann ich sie nicht namentlich nennen. Am Ende möchte ich nur das Name/Wert-Paar jedes Elements innerhalb jedes <Result>.

var query = from item in xml.Descendants("Result") 
       select item; 

Irgendwelche Hilfe?

Danke, -Scott

+0

'Descendants' sollte nicht zurückkehren Dinge "innen"' Ergebniselement. Es sollte eine Folge von'Ergebnis'-Elementen zurückgeben, und das ist offensichtlich, was Sie brauchen. Was genau funktioniert nicht mit 'Descendants'? –

+0

Ich habe gerade den Post aktualisiert, um den Code zu zeigen, den ich benutze und was ich versuche zu tun. – Scott

Antwort

1

Nachkommen werden alle absteigenden Knoten mit dem angegebenen Namen greifen. Wenn Sie spezifisch sein möchten, müssen Sie die XML-Hierarchie elementweise durchlaufen, z. B. xml.Element("ResultSet").Element("Results").Elements("Result").

Dies sollten Sie in die richtige Richtung:

var query = xml.Descendants("Result") 
       .Select(r => r.Elements() 
          .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var result in query) 
{ 
    foreach (var item in result) 
    { 
     Console.WriteLine("{0} : {1}", item.Name, item.Value); 
    } 
} 

Alternativ Sie SelectMany und glätten die Ergebnismenge verwenden können:

var query = xml.Descendants("Result") 
       .SelectMany(r => r.Elements() 
           .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var item in query) 
{ 
    Console.WriteLine("{0} : {1}", item.Name, item.Value); 
} 
+0

Ihr erstes Beispiel ist genau das, was ich gesucht habe. Dies hält die Namen/Werte gruppiert. Das zweite Beispiel ist, was ich immer bekam. Es ist zu flach, um nützlich zu sein, da ich nicht weiß, wo eine Gruppe anfängt und die andere endet. Dies ist perfekt. Vielen Dank! – Scott