在PowerShell中使用子属性中的Where-Object过滤(xml-)数据

时间:2019-07-23 15:49:06

标签: powershell

我在PowerShell中具有以下代码:

[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
  <Sequence>
    <SequenceName>Sequence-A</SequenceName>
    <SequenceMeta>
      <SequenceStart>2019-07-23T17:26:54.710+02:00</SequenceStart>
      <SequenceEnd>2019-07-23T17:26:54.741+02:00</SequenceEnd>
    </SequenceMeta>
  </Sequence>
  <Sequence>
    <SequenceName>Sequence-B</SequenceName>
    <SequenceMeta>
      <SequenceStart></SequenceStart>
      <SequenceEnd></SequenceEnd>    
    </SequenceMeta>
  </Sequence>
</Sequences>
"@

Clear-Host
$Sequences = $Xml.Sequences.Sequence | Where-Object -Property SequenceMeta.SequenceEnd
$Sequences

Remove-Variable -Name Xml

如您所见,我加载了XML-Data,然后我想用“ Where-Object”过滤它。 我想选择那些“ Sequence(s)”,其中“ SequenceEnd”属性具有一个值。

在此示例中,结果应为“ Sequence-A”。 结果中不应显示“ Sequence-B”,因为“ SequenceEnd”属性没有任何价值。

我不知道如何选择子属性“ Sequence-End”。我尝试了类似“ SequenceMeta.SequenceEnd”的方法,但是如您所见,它不起作用。

我正在寻找一种班轮。实际上,查询时间会更长。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

$Sequences = $xml.Sequences.Sequence | Where-Object {$_.SequenceMeta.SequenceEnd}
$Sequences

由于Where-Object脚本块{}中的内容是一个条件表达式,特别是一个比较,因此,没有值的属性将产生$false,而有值的属性将产生{{ 1}}(如果没有比较运算符)。 $true返回其脚本块语句为true的所有对象。

Where-Object使用语法(比较语句语法)有一些限制。首先,您只能引用管道对象中可用的第一级属性。换句话说,您只能比较Where-Object而不是SequenceMeta。代码SequenceMeta.SequenceEnd将返回一个对象,但是它将位于SequenceMeta属性级别而不是其父对象,可以使用$xml.Sequences.Sequence.SequenceMeta | Where-Object -Property SequenceEnd类可用的get_ParentNode方法来检索该对象。见下文。

XmlElement