C# 节点的第一个子节点的确切xpath是什么?

C# 节点的第一个子节点的确切xpath是什么?,c#,xml,xpath,C#,Xml,Xpath,我有如下XML代码: <?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/>

我有如下XML代码:

<?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>
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;
        }
如果我从上面的xml代码中调用网格xml节点的方法(
GetAllChildrenOfName(gridNode,“Label”)
),它不会为任何建议的xpath值返回预期的3个标签列表

猜猜看,xpath应该是什么样子


感谢
子节点:
是默认轴,因此如果
父节点
网格
,则
父节点。假设
标签
位于默认命名空间中,则SelectNodes(“标签”)
应该可以工作。如果您有xml名称空间,则需要通过创建名称空间管理器对其进行限定:

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

child::
是默认轴,因此如果
parent
Grid
,那么
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);
}
static int Main(字符串[]args)
{
XmlDocument xDoc=新的XmlDocument();
xDoc.LoadXml(“”);
Write(GetAllChildrenOfName(xDoc.FirstChild,“Label”).Count.ToString();
}
公共XmlNodeList GetAllChildrenOfName(XmlNode父项,字符串childName)
{
字符串xpath=childName;
返回parent.SelectNodes(xpath);
}
输出为3。

这对我很有效:

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);
}
static int Main(字符串[]args)
{
XmlDocument xDoc=新的XmlDocument();
xDoc.LoadXml(“”);
Write(GetAllChildrenOfName(xDoc.FirstChild,“Label”).Count.ToString();
}
公共XmlNodeList GetAllChildrenOfName(XmlNode父项,字符串childName)
{
字符串xpath=childName;
返回parent.SelectNodes(xpath);
}

结果是3。

因为我不知道为什么对其他人有效的解决方案对我无效,我只是用我自己的方法,如下所示:

<?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>
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;
        }
private List SelectNamedChildNodes(XmlNode父节点,字符串名)
{
列表=新列表();
foreach(parent.ChildNodes中的XmlNode节点)
{
if(node.Name==Name)list.Add(node);
}
退货清单;
}

可以使用与
XmlNodeList

相同的方法处理结果,因为我不知道为什么对其他人有效的解决方案对我无效,我只是使用了我自己的方法,如下所示:

<?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>
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;
        }
private List SelectNamedChildNodes(XmlNode父节点,字符串名)
{
列表=新列表();
foreach(parent.ChildNodes中的XmlNode节点)
{
if(node.Name==Name)list.Add(node);
}
退货清单;
}

可以使用与
XmlNodeList

相同的方法处理结果,这是无效的代码-您已经声明了三次xpath。我先整理一下代码示例。考虑到您的代码看起来应该可以工作,但实际上却不能工作,告诉我们对于
xpath=childName
,GetAllChildrenOfName()返回的是什么会很有帮助。一个空的节点列表?像Marc一样,我认为名称空间可能是原因,但如果是这样,我们无法从您发布的示例中看到这一点。如果您的XML在网格或标签元素或任何祖先上有任何xmlns:foo=“bar”属性,请告诉我们。另外,为什么要在问题标题中使用“第一个”?在你的问题中,我看不到任何与想要第一个孩子而不是后来的孩子有关的东西。我想“第一个”这个词是我的蹩脚英语。“第一”是指亲子关系树第一级中的所有子项。关于xmlns导入,我编辑了代码以查看我使用的是哪一个。这不是有效的代码-您已经声明了三次xpath。我先整理一下代码示例。考虑到您的代码看起来应该可以工作,但实际上却不能工作,告诉我们对于
xpath=childName
,GetAllChildrenOfName()返回的是什么会很有帮助。一个空的节点列表?像Marc一样,我认为名称空间可能是原因,但如果是这样,我们无法从您发布的示例中看到这一点。如果您的XML在网格或标签元素或任何祖先上有任何xmlns:foo=“bar”属性,请告诉我们。另外,为什么要在问题标题中使用“第一个”?在你的问题中,我看不到任何与想要第一个孩子而不是后来的孩子有关的东西。我想“第一个”这个词是我的蹩脚英语。“第一”是指亲子关系树第一级中的所有子项。关于xmlns导入,我编辑了代码以查看我使用的是什么。