首页 > 解决方案 > 如何在循环内正确选择已处理的 XML 元素(使用 PowerShell)

问题描述

我有以下包含 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-name 会有用,因为它可能不是唯一的。

谢谢

标签: 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

$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"

}

推荐阅读