Powershell - XPath - SUM() 和 Count() 子节点 - 仅限 XPath 表达式
Posted
技术标签:
【中文标题】Powershell - XPath - SUM() 和 Count() 子节点 - 仅限 XPath 表达式【英文标题】:Powershell - XPath - SUM() and Count() Child Nodes - XPath Expression Only 【发布时间】:2014-08-10 17:43:59 【问题描述】:Xpath 新手,powershell 中级。昨天花了很多时间研究,我在 powershell -XPath 命令中找不到 xpath sum() 或 count() 表达式的单个示例。我将这篇文章详细地写成我的第一个 *** 问题,以便未来的人们可以从这篇文章中找到来自 XPert 的明确示例答案。
目标(2): 1. Count() 关键进程。 2. SUM() 关键进程处理的事务。 注意:powershell XPath 命令的输出应该是原始数字。
<units>
<unit>
<unitName>Generic Process Unit</unitName>
<attribute>
<name>Process Type</name>
<value>Critical Process</value>
</attribute>
<attribute>
<name>Transactions Processed</name>
<value>10</value>
</attribute>
</unit>
<unit>
<unitName>Generic Process Unit</unitName>
<attribute>
<name>Process Type</name>
<value>Trivial Process</value>
</attribute>
<attribute>
<name>Transactions Processed</name>
<value>7</value>
</attribute>
</unit>
<unit>
<unitName>Generic Process Unit</unitName>
<attribute>
<name>Process Type</name>
<value>Critical Process</value>
</attribute>
<attribute>
<name>Transactions Processed</name>
<value>5</value>
</attribute>
</unit>
</units>
我对 SUM 函数的最佳尝试。甚至没有尝试计数:
select-xml -path mine.xml -XPath '//attribute[value="Critical Process"]/../attribute[name="Transactions Processed"][sum(value)]' | Select-Object -ExpandProperty node | select Value
编辑:notepad++ XMLTool 插件的工作 XPath 如下,但仍需要等效的 Powershell(这在 Powershell 中不起作用):
sum(//attribute[value="Critical Process"]/../attribute[name="Transactions Processed"]/value)
勘误表: 它需要仅是 XPath 表达式的原因是我只使用 powershell 来构造和验证我的 XPath 字符串。最终目标是将这些字符串放入将实际使用 XPath 字符串的非 powershell 软件中。该软件使我无法验证 XPath,并且在我将其放入后需要 20 分钟才能判断它是否有效,因此我使用 powershell 作为我的测试平台。
我更改了项目名称、描述和删除的属性以使示例更简单。但是,我不知道“模式”字是否重要,所以这里是原始“值”行的示例。
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Critical Process</value>
问题:
似乎需要稍微调整给定的 XPath 表达式才能在 Powershell 中工作。例如,在 -XPath '/xpath/node' 之后,您似乎总是需要以: '/text()' | 结尾。 Select-Object -ExpandProperty 节点 |选择值以实际查看您想要的输出。
Microsoft 有 XPath 文档和 Powershell 文档,但没有“Powershell 中的 XPath 表达式”文档。
大多数 Internet 表达式示例使用“Powershell + XPath”执行最低限度的 XPath 以获取数据对象,然后在 powershell 中使用 foreach 循环。
看起来命令语法可能对 XPath 版本 1、2 等有一些依赖性。
提前致谢。
【问题讨论】:
【参考方案1】:据我所知,这些函数不适用于 Select-Xml
,因为它似乎在幕后使用 [XmlDocument]::SelectNodes 只能返回节点。
您也可以使用导航器:
$xml = @'
#your xml here
'@ -as [xml]
$xml.CreateNavigator().Evaluate('count(//unit)')
$xml.CreateNavigator().Evaluate('sum(//unit)')
【讨论】:
感谢您的反馈安迪。我认为您的建议是,由于 select-xml 的设计,我的目标可能根本不可能实现,这可能是我问题的答案。如果我们可以确认,我肯定会接受。我将开始寻找官方文件。至于你的选择,它不适用于我的情况。再次感谢。 @JerryW。您可以反编译 cmdlet 以查看其在幕后运行的代码。为什么不能使用“本机”XmlDocument 对象? 之所以需要仅是 XPath 表达式,是因为我只使用 powershell 来构造和验证我的 XPath 字符串。最终目标是将这些字符串放入将实际使用 XPath 字符串的非 powershell 软件中。该软件让我无法验证 XPath,并且在我放入后需要 20 分钟才能判断它是否有效,所以我使用 powershell 作为我的测试平台。【参考方案2】:计数应该很简单
count(/units/unit[attribute[name="Process Type"][value="Critical Process"]])
(使用两个嵌套级别的谓词来确保name
和value
都在相同 attribute
)。对于总和,我们只是在表达式的末尾添加一点
sum(/units/unit[attribute[name="Process Type"][value="Critical Process"]]/attribute[name="Transactions Processed"]/value)
但请注意,这两个表达式都将返回一个 numeric 值,而不是节点集,这可能是使 powershell 感到困惑的地方。
【讨论】:
感谢 Ian,确实您的语句都是功能性 XPath 命令。不幸的是,由于它们在 powershell 中不起作用,我认为它们支持 Andy 的理论,即 powershell 中的 select-xml 仅用于返回节点和节点集。我想知道是否有可以返回数字的替代 powershell / xpath 模块。以上是关于Powershell - XPath - SUM() 和 Count() 子节点 - 仅限 XPath 表达式的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 7 上将文件重命名为 md5 sum + 扩展名(使用 CMD 或 PowerShell 2013)