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等。
提前致谢。
答案 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"]])
(使用两个嵌套级别的谓词来确保name
和value
都位于相同的 attribute
上)。总之,我们只是在表达式
sum(/units/unit[attribute[name="Process Type"][value="Critical Process"]]/attribute[name="Transactions Processed"]/value)
但请注意,这两个表达式都将返回 numeric 值,而不是节点集,这可能会让PowerShell感到困惑。