什么是节点的第一个子节点的精确xpath?

问题描述:

我有一个这样的XML代码:什么是节点的第一个子节点的精确xpath?

<?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> 

在代码中,这被表示为XML文档。现在的问题是在下面的代码:

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

    return parent.SelectNodes(xpath); 
} 

如果我呼吁从上面的XML代码电网XML节点(GetAllChildrenOfName(gridNode,"Label"))的方法,它不会对任何建议的返回3个标签的预期列表xpath值。

任何猜测,xpath应该如何?

感谢

+0

这不是有效的代码 - 你已经将xpath声明了三次。我会先清理代码示例。 – SamStephens 2010-09-30 08:31:08

+0

考虑到你的代码看起来应该可以工作,但是不会,告诉我们什么GetAllChildrenOfName()会为'xpath = childName'返回什么是有帮助的。一个空的节点列表?就像Marc一样,我会假定命名空间可能是原因,但如果是这样,我们无法从您发布的示例中看到。如果您的XML具有任何xmlns:foo =“bar”属性,请在Grid或Label元素或任何祖先上告诉我们。 – LarsH 2010-09-30 13:51:22

+0

另外,为什么你的问题标题中的“第一”?在你的问题中,我没有看到任何与想要第一个孩子而不是后来的孩子有关的问题。 – LarsH 2010-09-30 13:52:20

因为我没有找到为什么溶剂,为他人工作,对我来说不起作用,我只是用我自己的方法是这样的:

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; 
     } 

可以使用与XmlNodeList相同的方式处理结果。

child::是默认轴,所以如果parentGrid,然后parent.SelectNodes("Label")应该工作,假设Label是默认的命名空间。如果您对XML的命名空间,你需要创建一个命名空间管理器来限定它:

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

这为我工作:

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); 
} 

输出功率为3