如何找到特定的xml节点?

时间:2009-05-20 08:53:34

标签: c# .net xml

我有这个问题找到一个特定的xml节点我已经在stackoverflow上发布了这个问题,一些不错的人提出了xpath。

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

我发现路径往往特定于已存在的特定节点。我需要的程序不会得到任何特定的命名节点,因为在每次传递时都会将新节点添加到xml树中。这一切的长短都是我需要找到基于它远离当前节点

的位置的节点

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

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

使用xpath C#

2 个答案:

答案 0 :(得分: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="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
}

这当然假设node不是null,而是一个有效的XmlNode实例。

XPath表达式的细分:

  • ancestor :: greatgrandparent - &gt;这将找到位于层次结构中任何位置的任何名为“greatgrandparent”的节点(所以任何父级,祖父级等等)
  • / grandparent [position()= 1] - &gt;名为“祖父母”的第一个子节点
  • / parent [position()= last()] - &gt;名为“parent”的最后一个子节点
  • / child [position()= last()] - &gt;名为“child”的最后一个子节点

如果您想阅读一些有关XPath轴如何工作的信息,请参阅w3schools.com上的一些信息。

答案 1 :(得分:2)

XmlNode课程会回答您提出的所有问题。它具有名为ParentNodeFirstChildLastChild的属性,每个属性都返回另一个XmlNode

要在XPath中执行相同的操作,您可以使用".."缩写来获取父节点,使用"*[position()=1]""*[position()=last()]"来获取第一个和最后一个子节点,例如:

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

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