2010-12-13 7 views
0

Dans un document XML, comme les suivantes:Comment trouver des noeuds entièrement entre deux noeuds spécifiés

<root> 
    <fish value="Start"/> 
    <pointlessContainer> 
    <anotherNode value="Pick me!"/> 
    <anotherNode value="Pick me too!"/> 
    <fish value="End"/> 
    </pointlessContainer> 
</root> 

Comment puis-je utiliser la merveille de LINQ to XML pour trouver tous les nœuds complètement contenu par les fish noeuds ? Notez que dans cet exemple, j'ai délibérément placé les nœuds fish à différents niveaux dans le document, car je prévois que ce scénario se produira dans la nature.

Évidemment, dans cet exemple, je chercherais à obtenir les deux nœuds anotherNode, mais pas le nœud pointlessContainer. NB: les deux noeuds de «délimitation» peuvent avoir le même type (par exemple fish) que les autres noeuds non délimiteurs du document, mais ils ont des attributs uniques et sont donc faciles à identifier.

+0

Est-ce qu'il peut y avoir des nœuds sélectionnés qui sont * plus élevés * dans l'arbre que le nœud "start"? –

+0

Oh, vous voulez dire si les nœuds de début et de fin sont sur des branches différentes? Je n'avais pas pensé à ça. Je suppose que techniquement c'est possible. tbh Je ne sais pas assez sur cette saveur de XML (WordML) pour être sûr. – David

+0

Je considère que c'est très improbable, même si rien ne me surprendrait sur les formats MS Office. – David

Répondre

0

Pour votre échantillon, ce qui suit devrait faire

 XDocument doc = XDocument.Load(@"..\..\XMLFile2.xml"); 
     XElement start = doc.Descendants("fish").First(f => f.Attribute("value").Value == "Start"); 
     XElement end = doc.Descendants("fish").First(f => f.Attribute("value").Value == "End"); 
     foreach (XElement el in 
      doc 
      .Descendants() 
      .Where(d => 
       XNode.CompareDocumentOrder(d, end) == -1 
       && XNode.CompareDocumentOrder(d, start) == 1 
       && !end.Ancestors().Contains(d))) 
     { 
      Console.WriteLine(el); 
     } 

Mais je n'ai pas testé ou réfléchi de manière approfondie si cela fonctionne pour d'autres cas. Peut-être que vous pouvez vérifier certaines de vos données d'échantillon et de rendre compte si cela fonctionne.

+0

Avec quelque chose d'aussi compliqué que cela, je vais faire des tests unitaires sérieux, donc je vous ferai savoir si ça les passe quand je les ai écrits! – David

+0

Hmm. Je peux voir ce que fait votre code. Et merci, il m'aurait fallu des heures pour trouver des méthodes comme XNode.CompareDocumentOrder(). Merci beaucoup! – David

Questions connexes