我在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”的方法,但是如您所见,它不起作用。
我正在寻找一种班轮。实际上,查询时间会更长。
谢谢
答案 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