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

时间:2010-09-30 08:26:00

标签: 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/>
            <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代码调用grid xml节点(GetAllChildrenOfName(gridNode,"Label"))的方法,它不会返回任何建议的xpath值的3个标签的预期列表。

任何猜测,xpath应该怎么样?

由于

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这对我有用:

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。

答案 2 :(得分:0)

因为我没有找到为什么适用于他人的溶剂对我不起作用,我只是使用我自己的方法:

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相同的方式处理结果。