2011-09-21 2 views
1

J'essaie d'utiliser une seule expression XPath pour sélectionner un nœud dont un nœud enfant correspond à un autre nœud du document.XPath: Sélection d'un nœud basé sur une autre valeur de nœuds

Un match signifierait que TOUS attributs du noeud sont les mêmes. Donc, si un nœud était comparé avec plusieurs attributs, les comparaisons d'attributs individuels seraient impossibles à maintenir.

À titre d'exemple donné les éléments suivants:

<Network> 
    <Machines> 
     <Machine Name = "MyMachine"> 
      <Services> 
       <ServiceDetails Description="MyService" Executable="c:\Myservice.exe" DisplayName="My Service" Version="5"/> 
      </Services> 
     </Machine> 
     ... 
    </Machines> 
    <Services> 
     <Service Name = "Service1"> 
      <ServiceDetails Description="MyService" Executable="c:\Myservice.exe" DisplayName="My Service" Version="5"/> 
     </Service> 
     ... 
    </Services> 
</Network> 

Je veux obtenir le noeud de service de services sur la base des ServiceDetails énumérés sous MyMachine.

je pensais que ce serait ressembler à:

//Services/Service[ServiceDetails = //Machines/Machine[@Name='MyMachine']/ServiceDetails] 

mais il ne semble pas fonctionner. Je soupçonne que l'opérateur '=' ne gère pas correctement la comparaison des noeuds. Je pense qu'il existe des méthodes XPath 2.0 qui peuvent fonctionner mais j'utilise .NET 4.0 (espace de noms System.XML) Je ne sais pas si je peux les utiliser. Si les méthodes XPath 2.0 aideraient ici, j'apprécierais vraiment une explication sur la façon de les utiliser dans .Net 4.0.

Merci

+0

Êtes-vous essayer d'obtenir le '' sous '' en faisant correspondre les '@ description' attribue à la fois' '? (Cela fonctionnerait dans ce cas: '/ Réseau/Services/Service [ServiceDetails/@ Description =/Réseau/Machines/Machine [@ Nom = 'MyMachine']/Services/ServiceDetails/@ Description]') –

Répondre

4

Utilisez:

/*/Services/Service 
      [ServiceDetails/@Description 
      = 
      /*/Machines/Machine[@Name = "MyMachine"] 
          /Services/ServiceDetails/@Description 
      ] 
+0

Cela semble familier; -) –

+0

@DevNull: Absolument - J'ai vu votre commentaire et j'ai décidé de donner ma réponse - quand je l'ai écrit complètement, j'ai vu que c'est presque identique à l'expression dans votre commentaire. Cependant, il mérite d'être une réponse - pas un commentaire. S'il vous plaît, créez une réponse avec cette expression, puis je supprimerai la mienne :) –

+0

J'espérais que le PO clarifierait la question avant de répondre car l'exemple XML ne correspond pas à l'explication de ce qui essayait d'être mis en correspondance. Une réponse est suffisante. Je vais juste augmenter le vôtre puisque je suis d'accord. :-) –

Questions connexes