我有这个问题找到一个特定的xml节点我已经在stackoverflow上发布了这个问题,一些不错的家伙建议xpath.
我是一个xml新手.请我需要一个c#代码来找到父母,父母,父母(伟大的父母),然后是第一个孩子,最后一个孩子,最后一个孩子.代码必须迭代树并再次向下.在线查看很多xpath教程.
我发现该路径往往特定于已存在的特定节点.我需要的程序不会得到任何特定的命名节点,因为在每次传递时都会将新节点添加到xml树中.这一切的长短都是我需要找到基于它远离当前节点的位置的节点
我的意思是找到currentnode(伟大的祖父节点)的父父母,然后找到第一个孩子,然后找到最后一个子女
keepkind of currentnode.parentnode.parentnode.parentnode.firstchild.lastchild.lastchild;
使用xpath C#
假设您有一个名为nodestart 的XmlNode实例.然后,下面的代码将为您提供该节点的大祖父的第一个子节点的最后一个子节点的最后一个子节点:
XmlNode wantedNode = node.ParentNode.ParentNode.ParentNode.FirstChild.LastChild.LastChild;
Run Code Online (Sandbox Code Playgroud)
请注意,此代码可能会出现很多问题.如果任何引用的节点碰巧为null,则会出现NullReferenceException.因此,您需要在每个级别进行空检查:
XmlNode wantedNode;
if (node.ParentNode != null && node.ParentNode.ParentNode != null /* and so on through the full path */)
{
wantedNode = node.ParentNode.ParentNode.ParentNode.FirstChild.LastChild.LastChild;
}
Run Code Online (Sandbox Code Playgroud)
让我们用一个更具体的例子来研究它.假设我们有以下Xml文档:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<greatgrandparent>
<grandparent>
<parent id="1">
<child somevalue="3"></child>
</parent>
<parent id="2">
<child somevalue="4"></child>
<child somevalue="5"></child>
</parent>
</grandparent>
</greatgrandparent>
</root>
Run Code Online (Sandbox Code Playgroud)
如果我理解你的问题,如果我们从<child somevalue="3"></child>我们想要导航的节点开始<child somevalue="5"></child>.上面的代码示例将执行此操作.但是,如上所述,如果并非所有预期的节点都存在,则很容易给出异常.
即使你说你想要c#代码而不是XPath,在这种情况下我觉得XPath是要走的路.有很多方法可以解决这个问题.例如,如果节点具有不同的标记名称(如我的示例文档中所示),您可以这样做:
XmlNode wantedNode = node.SelectSingleNode("ancestor::greatgrandparent/grandparent[position()=1]/parent[position()=last()]/child[position()=last()]");
if (wantedNode != null)
{
// the path was found
}
Run Code Online (Sandbox Code Playgroud)
这当然是假设它node不是null,而是一个有效的XmlNode实例.
XPath表达式的细分:
如果您想阅读一些有关XPath轴如何工作的信息,请参阅w3schools.com上的一些信息.