如何使用PowerShell遍历XML的Values节点并过滤特定前缀的键?
问题:过滤并遍历XML中特定前缀的节点
给定如下XML内容:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <FlowInstance xmlns="http://www.oeplatform.org/version/2.0/schemas/flowinstance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oeplatform.org/version/2.0/schemas/flowinstance schema-1161.xsd"> <Values> <donotoutput> <Name><![CDATA[donotoutput]]></Name> <Value><![CDATA[donotoutput value]]></Value> </donotoutput> <specifics_test1> <Name><![CDATA[Test1]]></Name> <Value>Val1</Value> <Value>Val2</Value> <Value>Val3</Value> </specifics_test1> <specifics_test2> <Name><![CDATA[Test2]]></Name> <Value><![CDATA[Test2 value]]></Value> </specifics_test2> <specifics_test3> <Name><![CDATA[Test3]]></Name> <Value><![CDATA[Test3 value]]></Value> </specifics_test3> </Values> </FlowInstance>
需要遍历<Values>部分,仅处理标签名以specifics_开头的节点。尝试直接遍历$xml.FlowInstance.Values无法得到预期结果,也无法像哈希表那样用.Keys过滤节点。
解决方案
核心思路
$xml.FlowInstance.Values是单个XmlElement对象,而非子节点集合,因此直接遍历它只会输出对象本身。需要通过ChildNodes属性获取<Values>下的所有子节点,再过滤标签名符合前缀要求的节点。
实现代码
[xml]$xml = Get-Content -Path "C:\Temp\xml\xml_cleaned.xml" # 过滤出<Values>下标签名以specifics_开头的子节点 $targetNodes = $xml.FlowInstance.Values.ChildNodes | Where-Object { $_.Name -like 'specifics_*' } # 遍历处理每个符合条件的节点 foreach ($node in $targetNodes) { # 获取节点的Name文本 $nodeDisplayName = $node.Name.InnerText # 获取所有Value文本(支持多Value节点) $nodeValues = $node.Value | ForEach-Object { $_.InnerText } Write-Host "节点标签名: $($node.Name)" Write-Host "显示名称: $nodeDisplayName" Write-Host "对应值: $($nodeValues -join ', ')" Write-Host "-------------------------" }
代码说明
- 获取子节点:通过
ChildNodes属性拿到<Values>下的所有子元素,包括<donotoutput>、<specifics_test1>等。 - 过滤节点:用
Where-Object筛选标签名($_.Name)匹配specifics_*的节点。 - 提取内容:每个目标节点下的
<Name>和<Value>可以直接通过节点属性访问,多<Value>节点会自动形成集合,用-join可以合并成字符串。
内容的提问来源于stack exchange,提问作者babiloof
相关产品推荐
相关产品推荐

