假设你有一个名为node
一个XmlNode实例入手。然后下面的代码会给你该节点的伟大盛大父母的第一个孩子的最后一个孩子的最后一个子:
XmlNode wantedNode = node.ParentNode.ParentNode.ParentNode.FirstChild.LastChild.LastChild;
注意,有这么多的事情可以去错了这个代码。如果任何引用的节点碰巧为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;
}
让我们用更具体的示例来检查它。假设我们有下面的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>
如果我明白你的问题吧,如果我们从我们要导航到<child somevalue="5"></child>
节点<child somevalue="3"></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
}
当然这是假设node
不是空的,但有效的XmlNode实例。
击穿的XPath表达式:
- 祖先:: greatgrandparent - >这将找到名为“greatgrandparent”位于任何地方向上的层次结构(所以任何父,宏伟的父等)的任何节点
- /祖父母[位置()= 1] - >名为 “祖父母” 的第一个子节点
- /父[位置()=最后()] - >名为 “父” 的最后一个子节点
- /child [position()= last()] - >最后一个名为“child”的子节点
如果您想了解XPath轴的工作方式,请参阅w3schools.com。
请重新格式化问题,以便任何人都可以阅读它。 – OregonGhost 2009-05-20 08:57:11
请在问题中更具体。我真的不确定你想要做什么。找到某个节点的根节点? – Razzie 2009-05-20 09:00:16