我有以下包含XML数据的PowerShell代码:
[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
<Sequence>
<SequenceName>Sequence-A</SequenceName>
<SequenceNumber>01</SequenceNumber>
<Package>
<PackageFolder>Package-A</PackageFolder>
<PackageNumber>01</PackageNumber>
</Package>
<Package>
<PackageFolder>Package-B</PackageFolder>
<PackageNumber>02</PackageNumber>
</Package>
</Sequence>
<Sequence>
<SequenceName>Sequence-B</SequenceName>
<SequenceNumber>02</SequenceNumber>
<Package>
<PackageFolder>Package-C</PackageFolder>
<PackageNumber>01</PackageNumber>
</Package>
<Package>
<PackageFolder>Package-D</PackageFolder>
<PackageNumber>02</PackageNumber>
</Package>
</Sequence>
</Sequences>
"@
Clear-Host
( $Xml.Sequences.Sequence | Sort-Object SeqenceNumber | Select-Object -First 1 ).Package | ForEach-Object {
$xml.Sequences.SelectSingleNode( $_.PackageFolder )
}
如您所见,我遍历了XML定义的Sequence-A中的包。 我想向已处理的程序包中添加一个新的文本元素,例如:
<Package>
<PackageFolder>Package-A</PackageFolder>
<PackageNumber>01</PackageNumber>
<PackageProcessed>True</PackageProcessed>
</Package>
为此,我需要选择正确的节点。
在一个简单的沙箱中,我使用了类似的东西:
$xml.xxxx.SelectSingleNode("Package")
Ofc不能像这样工作,我正在寻找一种方法来定位/选择循环内当前处理的节点。
我不认为搜索PackageFolder名称会很有用,因为它可能不是唯一的。
谢谢
答案 0 :(得分:0)
它似乎是这样工作的:
[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
<Sequence>
<SequenceName>Sequence-A</SequenceName>
<SequenceNumber>01</SequenceNumber>
<Package>
<PackageFolder>Package-A</PackageFolder>
<PackageNumber>01</PackageNumber>
</Package>
<Package>
<PackageFolder>Package-B</PackageFolder>
<PackageNumber>02</PackageNumber>
</Package>
</Sequence>
<Sequence>
<SequenceName>Sequence-B</SequenceName>
<SequenceNumber>02</SequenceNumber>
<Package>
<PackageFolder>Package-C</PackageFolder>
<PackageNumber>01</PackageNumber>
</Package>
<Package>
<PackageFolder>Package-D</PackageFolder>
<PackageNumber>02</PackageNumber>
</Package>
</Sequence>
</Sequences>
"@
Clear-Host
$Packages = ( $Xml.Sequences.Sequence | Sort-Object SeqenceNumber | Select-Object -First 1 ).Package
foreach ( $Package in $Packages ) {
IF ( -not $Package.PackageProcessed ) { $Package.AppendChild( $Xml.CreateElement( "PackageProcessed" ) ) | Out-Null }
$Package.PackageProcessed = "True"
}