C# 节点的第一个子节点的确切xpath是什么?
我有如下XML代码: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 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导入,我编辑了代码以查看我使用的是什么。