[英]Powershell - XPath - SUM() and Count() Child Nodes - XPath Expression Only
Xpath的新手,在powershell中处于中间。 昨天花了很多时间研究,但在powershell -XPath命令中找不到xpath sum()或count()表达式的单个示例。 我将这作为我的第一个stackoverflow问题来进行详细介绍,以便将来的人们可以从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功能的最佳尝试。 甚至没有尝试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用作测试平台。
我更改了项目名称,说明并删除了属性,以使示例更简单。 但是,我不知道“ schema”一词是否重要,因此这里是原始“ value”行的一个示例。
<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()'结尾。 选择对象-ExpandProperty节点| 选择“值”以实际查看所需的输出。
Microsoft具有XPath文档和Powershell文档,但是没有“ PowerShell中的XPath表达式”文档。
大多数Internet表达式的示例都使用“ Powershell + XPath”来做最少的XPath来获取数据对象,然后在powershell中使用foreach进行循环。
看起来命令语法可能与XPath版本1、2等有关。
提前致谢。
据我所知,这些功能不适用于Select-Xml
因为它似乎在幕后只能使用返回节点的[XmlDocument] :: SelectNodes。
或者,您可以使用导航器:
$xml = @'
#your xml here
'@ -as [xml]
$xml.CreateNavigator().Evaluate('count(//unit)')
$xml.CreateNavigator().Evaluate('sum(//unit)')
计数应尽可能简单
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)
但是请注意,这两个表达式都将返回数字值,而不是节点集,这可能会使powershell感到困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.