gpt4 book ai didi

xml - 在XML子节点上过滤

转载 作者:行者123 更新时间:2023-12-02 23:42:28 25 4
gpt4 key购买 nike

我正在尝试处理MSBuild文件,以使用下面的PowerShell代码段提取Include属性中的文件名。

Get-ChildItem $xmlFile |
ForEach-Object { Write-Host $_.FullName; [xml](Get-Content $_) } |
Where-Object {
(($_.Project.ItemGroup -ne $null) -and
($_.Project.ItemGroup.ProjectFile -ne $null))
} -ErrorAction SilentlyContinue |
ForEach-Object { $_.Project.ItemGroup.ProjectFile } |
Where-Object { ($_.Include -ne $null) } |
ForEach-Object { Write-Host $_ }

对于具有 ItemGroup子元素的XML来说,这很好用:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="settings.props" />
<ItemGroup>
<ProjectFile Include="filename.proj"/>

但是,当XML层次结构如下所示(没有 ItemGroup元素)不同时,脚本将失败并显示以下错误:

The property 'ItemGroup' cannot be found on this object. Verify that the property exists.



甚至 ErrorAction也不能抑制错误输出。

我如何在管道中检查子元素是否存在,并跳过不存在的文件?而且,为什么 -ErrorAction参数不起作用?

最佳答案

您不需要使用Get-Content加载文件,将其转换为xml并尝试自己选择节点。只需使用Select-XML cmdlet:

Get-ChildItem $xmlFile | ForEach-Object {
$node = Select-Xml -Path $_.FullName `
-XPath '/n:Project/n:ItemGroup/n:ProjectFile/@Include' `
-Namespace @{n = 'http://schemas.microsoft.com/developer/msbuild/2003'}

if ($node)
{
$node.Node.Value
}
}

它使用 xpath选择 Include属性(和 namespace)。

输出:
filename.proj

关于xml - 在XML子节点上过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37691781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com