2011-05-10 5 views
3

Je suis nouveau sur xpath en C# et j'essaie de sélectionner un élément qui a deux valeurs spécifiques. C'est ce que le format XML ressembleC# Utilisation de XPATH pour sélectionner un élément spécifique avec des valeurs connues, puis supprimer

<?xml version="1.0" encoding="utf-8"?> 
<Manager> 
    <SSH> 
    <Tunnels> 
     <Port> 
     <Local>443</Local> 
     <Remote>443</Remote> 
     </Port> 
     <Port> 
     <Local>5432</Local> 
     <Remote>5432</Remote> 
     </Port> 
     <Port> 
     <Local>19</Local> 
     <Remote>21</Remote> 
     </Port> 
     <Port> 
     <Local>19</Local> 
     <Remote>22</Remote> 
     </Port> 
    </Tunnels> 
    </SSH> 
</Manager> 

je tentais de sélectionner un « Port » qui avait les valeurs d'une forme précédente afin que je puisse supprimer cette entrée spécifique du xml. C'était le code que j'utilisais:

 //remove children from selected 
     XmlNode _xmlTunnel = _xml.SelectSingleNode("/Manager/SSH/Tunnels/Port[Local=" + _local + "] | /Manager/SSH/Tunnels/Port[Remote=" + _remote + "]"); 
     MessageBox.Show("Local " + sshList.SelectedItems[0].Text + " Remote " + sshList.SelectedItems[0].SubItems[1].Text +"\n\n" + _xmlTunnel.InnerText); 
     _xmlTunnel.RemoveAll(); 

     //remove all empties 
     XmlNodeList emptyElements = _xml.SelectNodes(@"//*[not(node())]"); 
     for (int i = emptyElements.Count -1; i >= 0; i--) { 
     emptyElements[ i ].ParentNode.RemoveChild(emptyElements[ i ]); } 

Ce code fonctionne bien jusqu'à ce que j'ai deux ports avec la même valeur locale. Il sélectionne toujours le premier élément auquel il appartient (c'est-à-dire Local = 19 et Remote = 21, même si vous essayez de sélectionner le nœud où Local = 19 et Remote = 22). J'ai essayé de changer l'expression xpath en 'et' au lieu de '|' dans la méthode SelectSingleNode mais que les erreurs avec une "Expression doit évaluer à un ensemble de nœuds". Ce qui me fait penser que j'évalue à un booléen quand j'utilise 'et'.

Est-ce la meilleure façon de le faire par une boucle où a sélectionner le premier élément et la boucle jusqu'à ce que le second correspond? Comme je l'ai déjà dit, je n'ai pas beaucoup d'expérience avec les expressions xpath/xml en C#, il y a peut-être un meilleur moyen. Si cela aide j'utilise Windows Forms et. Net 4.0, dans ce formulaire les valeurs de port remplissent une vue de liste de deux colonnes dans la vue détaillée.

Répondre

3

Vous devez "et" 2 conditions sur le noeud Port comme:

"/Manager/SSH/Tunnels/Port[Local=" + _local + " and Remote=" + _remote + "]" 

Dans votre cas, vous faites union de 2 ensembles où local = 19 et un autre où à distance = 21.

+0

fonctionne parfaitement, j'espérais que j'étais proche, merci! – FeatherKing

Questions connexes