什么是节点的第一个子节点的精确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应该如何?
感谢
答
因为我没有找到为什么溶剂,为他人工作,对我来说不起作用,我只是用我自己的方法是这样的:
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::
是默认轴,所以如果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);
}
输出功率为3
这不是有效的代码 - 你已经将xpath声明了三次。我会先清理代码示例。 – SamStephens 2010-09-30 08:31:08
考虑到你的代码看起来应该可以工作,但是不会,告诉我们什么GetAllChildrenOfName()会为'xpath = childName'返回什么是有帮助的。一个空的节点列表?就像Marc一样,我会假定命名空间可能是原因,但如果是这样,我们无法从您发布的示例中看到。如果您的XML具有任何xmlns:foo =“bar”属性,请在Grid或Label元素或任何祖先上告诉我们。 – LarsH 2010-09-30 13:51:22
另外,为什么你的问题标题中的“第一”?在你的问题中,我没有看到任何与想要第一个孩子而不是后来的孩子有关的问题。 – LarsH 2010-09-30 13:52:20