【问题标题】:xPath find ancestors through XPathNavigator object and not through expression evaluationxPath 通过 XPathNavigator 对象而不是通过表达式求值来查找祖先
【发布时间】:2014-02-11 00:03:49
【问题描述】:

我正在尝试查找某个节点的祖先。我们称它为“NodeA”。我得到一个“NodeA”节点列表,并想查找它的祖先以检查某个属性值。这是我检索所有“NodeA”节点的代码:

String xPathExpression = "//*[local-name()='NodeA']";
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(xPathExpression);
foreach (XPathNavigator item in nodeSet)
{
      // Iterate through ancestors in here.
}

在“//在这里迭代祖先”区域中,我可以通过表达式评估我的节点并通过以下方式获取祖先列表(对于每个“NodeA”):

XPathNavigator item;
var ancestorExpression = string.Format("//*[name()='{0}']/ancestor-or-self::*", item.Name);
XPathNodeIterator ancestors = (XPathNodeIterator)navigator.Evaluate(ancestorExpression);

但是,这似乎是多余的,因为我有原始的 xml 和一个 XPathNavigator 实例,我是否可以不只在那时获得我的祖先而不必通过导航器评估表达式?类似于以下内容(其中 item 的类型为 XPathNavigator):

item.GetAncestors();

Helper.GetAncestors(fullXML, item)

我意识到该项目上有一个 SelectAncestors 方法,但我没有运气让它工作。但如果是这样,一个例子将不胜感激

<NodeAGrandDaddy>
   <NodeADaddy>
      <NodeA>
      <NodeA/>
   <NodeADaddy/>
<NodeAGrandDaddy/>

【问题讨论】:

  • 基里尔。我添加了它,但这并不重要,因为我想获取所有祖先,而不管节点类型如何。而且我似乎无法使用 XPathNavigator 实例来做到这一点。

标签: c# .net xml xpath xpathnavigator


【解决方案1】:

好的,好吧,你可以将Select 方法与ancestor-or-self::* 一起使用,即:

item.Select("ancestor-or-self::*")

【讨论】:

  • 拥有 SelectAncestors 方法真的让我很困惑。非常直观,不敢相信我忽略了它。谢谢!
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多