Powershell - XPath - SUM()和Count()子节点 - 仅限XPath表达式

时间:2014-08-10 17:43:59

标签: xml powershell xpath

Xpath新手,与powershell合作。花了很多时间研究昨天,我在powershell -XPath命令中找不到xpath sum()或count()表达式的单个例子。我将这篇文章详细地写成我的第一个stackoverflow问题,以便将来的人们可以从XPert中找到这篇文章以获得明确的示例答案。

目标(2): 1.计算()关键过程。 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函数。没有尝试过Count:

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作为我的测试平台。

我已更改项目名称,说明和已移除的属性,以使示例更简单。但是,我不知道&#34;架构&#34;单词很重要,所以这里有一个原始&#34;值&#34;线。

<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&#39; / xpath / node&#39;之后你似乎总是需要结束:&#39; / text()&#39; | Select-Object -ExpandProperty节点|选择值以实际查看所需的输出。

  • Microsoft拥有XPath文档和Powershell文档,但在Powershell中没有&#34; XPath表达式&#34;文档。

  • 大多数表达式的互联网示例使用&#34; Powershell + XPath&#34;做最小的XPath来获取数据对象,然后在powershell中使用foreach循环。

  • 看起来命令语法可能依赖于XPath版本1,2等。

提前致谢。

2 个答案:

答案 0 :(得分:2)

据我所知,这些函数不能与Select-Xml一起使用,因为它似乎在后台使用[XmlDocument] :: SelectNodes只能返回节点。

作为替代方案,您可以使用导航器:

$xml = @'
#your xml here
'@ -as [xml]

$xml.CreateNavigator().Evaluate('count(//unit)')
$xml.CreateNavigator().Evaluate('sum(//unit)')

答案 1 :(得分:0)

计数应该像

一样简单
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感到困惑。