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"]])

(使用两个嵌套级别的谓词来确保namevalue 都在相同 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)

Powershell Get File/Disk Size

linux shell md5sum 指令的诡异问题

unix 编一个shell,使用md5sum将路径中的文件分类

shell里的md5sum生成的结果为啥与程序生成的不一样

XPath 相关内容