如何在PowerShell中筛选嵌套master标签值为New的XML节点
正确实现代码
你需要逐一遍历所有foo节点,先按master值筛选,再取对应节点下的val1,写法如下:
# 筛选master为New的foo节点,提取对应val1值 $xml.xml.foo | Where-Object { $_.master -eq 'New' } | ForEach-Object { $_.data.val1 }
如果不需要额外遍历处理直接拿值,也可以简化成:
($xml.xml.foo | Where-Object master -eq 'New').data.val1
原写法错误原因
- 之前的
Where-Object后用了括号而非脚本块{},且提前取出了val1值,丢失了和上层master标签的关联关系,无法完成匹配筛选 - 直接判断
$xml.xml.foo.master -eq "New"会返回所有foo节点的master值与字符串比较的布尔数组,不能实现逐节点判断的效果
可选:未闭合标签兼容加载方案
你提到文件偶尔存在未闭合标签,直接用[xml]强转也可能出现解析失败,可以改用宽松的XML加载方式,提升兼容性:
$xmlSettings = [System.Xml.XmlReaderSettings]::new() # 调整兼容级别,允许非完整XML结构 $xmlSettings.ConformanceLevel = [System.Xml.ConformanceLevel]::Fragment $xmlReader = [System.Xml.XmlReader]::Create($file, $xmlSettings) $xml = [System.Xml.XmlDocument]::new() $xml.Load($xmlReader) $xmlReader.Dispose()
内容的提问来源于stack exchange,提问作者arealhobo
相关产品推荐
相关产品推荐

