首页 > 解决方案 > 使用 Where-Object 从 XML 中过滤数据

问题描述

我有一个 XML 文件,其中包含有关包含包的序列的数据。我正在尝试获取一个包含有关失败包的信息的 powershell 对象。( <PackageSuccess>False</PackageSuccess>)

您可以在下面找到包含示例数据的 XML 文件的结构。(简化。我希望它仍然是真实的......)
您还可以找到过滤失败包的代码:

[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
  <Sequence>
    <SequenceName>Sequence1</SequenceName>
    <SequencePackages>
      <Package>
        <PackageName>Package1</PackageName>
        <PackageMeta>
          <PackageSuccess>True</PackageSuccess>
        </PackageMeta>
      </Package>
      <Package>
        <PackageName>Package2</PackageName>
        <PackageMeta>
          <PackageSuccess>False</PackageSuccess>
        </PackageMeta>
      </Package>
    </SequencePackages>
    <SequenceMeta>
      <Finished>True</Finished>
    </SequenceMeta>
  </Sequence>
  <Sequence>
    <SequenceName>Sequence2</SequenceName>
    <SequencePackages>
      <Package>
        <PackageName>Package3</PackageName>
      </Package>
    </SequencePackages>
  </Sequence>
</Sequences>
"@

Clear-Host

$ProcessedSequences = $Xml.Sequences.Sequence | Where-Object { $_.SequenceMeta.Finished -eq $true }
$FailedPackages = $ProcessedSequences.SequencePackages.Package | Where-Object { $_.PackageMeta.PackageSuccess -ne "True" }
$FailedPackages

输出如下:

PackageName PackageMeta
----------- -----------
Package2    PackageMeta

这在某种程度上是可以的,但我也希望在输出中有 SequenceName,如下所示:

PackageName PackageSuccess SequenceName
----------- -----------    -----------
Package2    False          Sequence1

我无法为此找到一个干净的解决方案。

谢谢

标签: powershell

解决方案


使用计算属性Select-Object并使用ParentNode元素上的属性走到保存SequenceName元素的祖先节点:

$FailedPackages |Select-Object PackageName,PackageMeta,@{Name='SequenceName';Expression={$_.ParentNode.ParentNode.SequenceName}}

推荐阅读