2009-05-20 118 views
0

我有这个问题找到一个特定的XML节点我已经发布这个问题在stackoverflow和一些不错的研究员建议xpath。如何找到特定的xml节点?

我是一个XML新手。请我需要一个C#代码找到父母,父母,父母(伟大的祖辈),然后找到第一个孩子,lastchild,lastchild。代码必须迭代树并再次下来。在线查看许多xpath教程。

我发现路径往往是特定于已存在的特定节点的。我需要的程序不会得到任何特定的命名节点,因为每次传递时都会将新节点添加到xml树中。总而言之,我需要找到节点基地位置远离当前节点

我的意思是找到当前节点(伟大的祖父节点)的父亲父母,然后找到第一个孩子,然后找到lastchild lastchild

keepkind of currentnode.parentnode.parentnode.parentnode.firstchild.lastchild.lastchild;使用

的XPath C#

+0

请重新格式化问题,以便任何人都可以阅读它。 – OregonGhost 2009-05-20 08:57:11

+0

请在问题中更具体。我真的不确定你想要做什么。找到某个节点的根节点? – Razzie 2009-05-20 09:00:16

回答

5

假设你有一个名为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

+0

嗨弗雷德里克,没有为我工作我一直得到异常消息 – Spikie 2009-05-20 09:07:42

2

您提出的所有问题均由XmlNode课程回答。它有属性ParentNode,FirstChildLastChild其中每个返回XmlNode

要做到同样的事情在XPath中可以使用".."缩写,以便获得一个节点的父,和"*[position()=1]""*[position()=last()]"获得第一和最后一个孩子,如:

XmlNode foundNode = node.SelectSingleNode("../../../*[position()=1]/*[position()=last()]/*[position()=last()]"); 

(注:” .. “是parent :: *轴的缩写,”*“是”child :: *“轴的缩写)