如何在循环内部正确选择经过处理的XML元素(使用PowerShell)

时间:2019-07-16 07:59:43

标签: 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名称会很有用,因为它可能不是唯一的。

谢谢

1 个答案:

答案 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"

}