我有这样的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应该怎么样?
由于
答案 0 :(得分:3)
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);
答案 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
相同的方式处理结果。