2010-08-20 3 views
0

Étant donné ce XML, je veux récupérer un XmlNodeList de <member> nœuds de <group> nœuds dont <id> correspond à 'Tech'. L'appariement devrait être insensible à la casse.Encore une autre question prédictive .NET XPath

<groups> 
     <group> 
      <id>Tech</id> 
      <members> 
       <member>johndoe</member> 
       <member>janedoe</member> 
       <member>robdoe</member> 
      </members> 
     </group> 
     <group> 
      <id>Support</id> 
      <members> 
       <member>johnfoe</member> 
       <member>janefoe</member> 
       <member>robfoe</member> 
      </members> 
     </group> 
    </groups> 

J'ai essayé, attendant d'obtenir les « membres de biches », mais il ne semble pas y retourner aucun résultat.

 // assume groupName='tech' 
    _document.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + groupName.ToUpper() + "']/members/member"); 
+0

Voir ma réponse à une supposition que vous encore ne nous montrez le vrai document XML :) –

+0

Veuillez mettre à jour le titre de votre question pour quelque chose de plus pertinent. –

Répondre

0

Je soupçonne que la valeur de groupName n'est pas ce que vous pensez qu'il est.

Je compilé cet exemple, en fonction de votre code, et je suis les résultats que vous semblez attendre:

var doc = new XmlDocument(); 
doc.LoadXml(
@"<groups> 
    <group> 
     <id>Tech</id> 
     <members> 
      <member>johndoe</member> 
      <member>janedoe</member> 
      <member>robdoe</member> 
     </members> 
    </group> 
    <group> 
     <id>Support</id> 
     <members> 
      <member>johnfoe</member> 
      <member>janefoe</member> 
      <member>robfoe</member> 
     </members> 
    </group> 
</groups>"); 
foreach (XmlElement node in doc.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + "tech".ToUpper() + "']/members/member")) 
    Console.WriteLine(node.InnerText); 

johndoe
janedoe
robdoe
Appuyez sur une touche pour continuer. . .

Mon autre hypothèse (un coup de poignard dans l'obscurité, car il semble fonctionner pour moi!), est que vous exécutez dans des problèmes avec la langue actuelle (utilisation de la traduction?), Ou le document XML le chargement est-il en quelque sorte cassé (marque d'ordre des octets?). Fondamentalement, des problèmes avec vos flux de caractères.

0

Encore une fois, très probablement votre document XML n'est pas ce que vous nous avez montré. Très souvent, la raison pour laquelle une expression XPath correcte ne fonctionne pas est que le document a un espace de nom par défaut défini et que les noms utilisés dans les expressions ne sont pas préfixés.

Cette C# application console:

using System; 
using System.Xml; 

class TestXPath 
{ 
    static void Main(string[] args) 
    { 
     string xmlText = 
@"<groups> 
    <group> 
     <id>Tech</id> 
     <members> 
      <member>johndoe</member> 
      <member>janedoe</member> 
      <member>robdoe</member> 
     </members> 
    </group> 
    <group> 
     <id>Support</id> 
     <members> 
      <member>johnfoe</member> 
      <member>janefoe</member> 
      <member>robfoe</member> 
     </members> 
    </group> 
</groups>"; 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xmlText); 

     string groupName = "tech"; 

     string xpathExpr = 
@"//groups/group 
      [translate(id,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') 
      ='" 
      + groupName.ToUpper() [email protected]"' 
      ] 
      /members/member"; 

     XmlNodeList selection = doc.SelectNodes(xpathExpr); 

     foreach (XmlNode node in selection) 
     { 
      Console.WriteLine(node.OuterXml); 
     } 

    } 
} 

lors de son exécution, produit attendu, résultat correct:

<member>johndoe</member> 
<member>janedoe</member> 
<member>robdoe</member>