0

我正在研究一个 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 语句来通过变量访问这第三个“水果”位置?也许我想访问这个位置,以便我可以将“橙色”更改为“香蕉”或其他东西。我尝试了以下但没有成功。. .

$橙色位置 = ??? (出于测试目的,我分配了 3 的值)

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

我已经看到“位置()”被分配了一个整数值。我想使用一个变量来代替整数,因为我不知道特定文件中的内部文本“橙色”可能是什么索引。这甚至可能吗?我看过其他质疑类似问题的帖子,但是当我将解决方案(如果有的话)应用于powershell脚本时,它们似乎都不起作用。关于如何解决这个问题的任何想法?

4

2 回答 2

1

你可以使用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值。

于 2013-08-10T16:28:26.250 回答
0

看来我让这件事变得比需要的更难。经过广泛的研究,我了解到根本不需要使用索引/位置整数。我可以通过执行以下操作来实现我所需要的。. .

root.SelectNodes('//categories/fruit') | Where-Object {$ .InnerText.Contains('orange')} | foreach {$ .InnerText -eq '香蕉'}

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

于 2013-08-14T16:44:13.463 回答