2010-09-30 10 views
0

J'ai un code XML comme ceci:Qu'est-ce que xpath exact pour les premiers noeuds d'un noeud?

<?xml version="1.0" encoding="utf-8" ?> 
<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Grid> 
      <Label/> 
      <Label/> 
      <Label/> 
    </Grid> 
</Window> 

Dans le code, ceci est représenté comme un document XML. La question est dans le code qui suit:

public XmlNodeList GetAllChildrenOfName(XmlNode parent, string childName) 
{ 
    string xpath = childName; 
    //string xpath = "/" + childName; 
    //string xpath = "//" + childName; 

    return parent.SelectNodes(xpath); 
} 

Si j'appelle la méthode pour le noeud xml grille (GetAllChildrenOfName(gridNode,"Label")) à partir du code XML ci-dessus, il ne retourne pas la liste prévue de 3 étiquettes pour l'une des suggéré Valeurs xpath.

Des suppositions, à quoi devrait ressembler le xpath?

Merci

+0

Ce code n'est pas valide: vous avez déclaré xpath trois fois. Je range l'échantillon de code en premier. – SamStephens

+0

Étant donné que votre code apparaît comme il devrait fonctionner, mais ne le fait pas, il serait utile de nous dire ce que GetAllChildrenOfName() * renvoie * pour 'xpath = childName'. Une nodeliste vide? Comme Marc, je suppose que les espaces de noms pourraient être la raison, mais si c'est le cas, nous ne pouvons pas voir cela à partir de l'échantillon que vous avez posté. Si votre code XML a des attributs xmlns: foo = "bar", sur les éléments Grid ou Label ou tout ancêtre, tenez-nous au courant. – LarsH

+0

aussi, pourquoi le "premier" dans le titre de votre question? Je ne vois rien dans votre question pertinente pour vouloir les premiers enfants par opposition aux enfants plus tard. – LarsH

Répondre

0

Parce que je n'a pas trouvé pourquoi le sollution, qui travaille pour les autres, ne fonctionne pas pour moi, je simplement utilisé ma propre méthode comme ceci:

private List<XmlNode> SelectNamedChildNodes(XmlNode parent, string name) 
     { 
      List<XmlNode> list = new List<XmlNode>(); 
      foreach (XmlNode node in parent.ChildNodes) 
      { 
       if (node.Name == name) list.Add(node); 
      } 
      return list; 
     } 

Il est possible de travailler avec le résultat de la même manière qu'avec le XmlNodeList.

3

child:: est l'axe par défaut, donc si parent est le Grid, alors parent.SelectNodes("Label") devrait fonctionner, en supposant que Label est dans l'espace de noms par défaut. Si vous avez xml-namespaces vous aurez besoin pour se qualifier en créant un gestionnaire d'espace de noms:

var nsmgr = new XmlNamespaceManager(parent.OwnerDocument.NameTable); 
nsmgr.AddNamespace("foo","blah/your/namespace"); 
return parent.SelectNodes("foo:Label", nsmgr); 
1

Cela a fonctionné pour moi:

static int Main(string[] args) 
{ 
    XmlDocument xDoc = new XmlDocument(); 
    xDoc.LoadXml("<Grid><Label /><Label /><Label /></Grid>"); 
    Response.Write(GetAllChildrenOfName(xDoc.FirstChild, "Label").Count.ToString()); 
} 

public XmlNodeList GetAllChildrenOfName(XmlNode parent, string childName) 
{ 
    string xpath = childName; 
    return parent.SelectNodes(xpath); 
} 

Et la sortie était 3.

Questions connexes