XPath语句,将一个整数变量分配给powershell脚本中的position()函数



我正在编写一个Powershell脚本,该脚本以XML文件为输入,搜索与该XML文件中特定元素/标记相关的内部文本,并返回该元素/标记的位置(如果存在),以便该元素的位置可以用来用其他数据替换内部文本。例如,可能有一个xml文件看起来如下。

<root>
    <category>
        <fruit>apple</fruit>
        <vegetable>broccoli</vegetable>
        <fruit>pear</fruit>
        <vegetable>brussel sprouts</vegetable>
        <fruit>orange</fruit>
    </category>
</root>

所以,假设在我的Powershell脚本的一部分中,我有一些代码来查找内部文本"橙色"。我想在一个变量中存储"水果"元素的"位置"整数,该元素包含"橙色"作为其内部文本。因此,在上面的xml文件中,位置整数将为3(如果从零开始,则为2)。我该如何编写一个合适的XPath语句来通过变量访问第三个"水果"位置?也许我想访问这个位置,这样我就可以把"橙色"改成"香蕉"之类的。我尝试了以下几种,但没有成功。

$orangePosition=???(出于测试目的,我指定了一个值3)

root.SelectSingleNode("subscendant::category/fruit[position()=$orangePosition]")

我看到"position()"被赋予了一个整数值。我想用一个变量来代替整数,因为我不知道特定文件中的内部文本"orange"可能是什么索引。这可能吗?我看到过其他帖子质疑类似的问题,但当我应用解决方案时,它们似乎都不起作用(如果有声明的话)到powershell脚本)。关于如何解决这个问题,有什么想法吗?

您可以使用root.SelectNodes("//category/fruit[. = 'orange']/preceding-sibling::fruit).Count + 1。如果要单独使用XPath,请使用Evaluate方法,例如root.CreateNavigator().Evaluate("count(//category/fruit[. = 'orange']/preceding-sibling::fruit) + 1")。它应该返回一个C#double值。

我似乎比需要的更难做到这一点。经过广泛的研究,我了解到根本没有必要使用索引/位置整数。我可以通过做以下事情来实现我所需要的。

root.SelectNodes('//categories/fruit')| Where Object{$.InerText.Contains('orage')}| foreach{$.InterText-eq'banan'}

但是,我仍然可以想到这样的情况:我可能想知道我想编辑的元素的索引,这样我就可以排除可能包含相同内部文本的其他类似元素。不管怎样,这对我现在的目的来说已经足够好了。感谢所有响应并试图提供帮助的人。

最新更新