附加具有不同值的克隆 XML 节点 - Powershell

Append cloned XML node with different value - Powershell

我有一个 XML 文件,格式如下:

<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
  <_locDefinition>
    <_locDefault _loc="locNone" />
    <_locTag _loc="locData">displayName</_locTag>
  </_locDefinition>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">something</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
</migration>

我需要克隆 <component> 标签几次,这取决于一些值,可能是大约 4-5 次。

我正在尝试使用以下代码,但我无法附加所有值,而只能附加最终值。

奇怪的是没有错误。

$something = @(1, 2, 3, 4, 5, 5)

foreach($num in $something) {
    $drivething = "D:"
    $xml = [xml](Get-Content -Path "C:\Temp\referenceXml.xml")
    $element = $xml.migration.component.clone()
    $xml.DocumentElement.AppendChild($element)
}

$xml.Save("C:\temp\newXML.xml")

预期输出为:

<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
  <_locDefinition>
    <_locDefault _loc="locNone" />
    <_locTag _loc="locData">displayName</_locTag>
  </_locDefinition>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">something</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">1</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">2</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
</migration>

但我得到的只是:

<?xml version="1.0" encoding="UTF-16"?>
<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/MigExcludeDrives">
  <_locDefinition>
    <_locDefault _loc="locNone" />
    <_locTag _loc="locData">displayName</_locTag>
  </_locDefinition>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">something</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
  <component type="Documents" context="UserAndSystem">
    <displayName _locID="migexcludedrives.excludedrives">Unconditional Exclude Drives</displayName>
    <role role="Data">
      <rules>
        <unconditionalExclude>
          <objectSet>
            <pattern type="File">5</pattern>
          </objectSet>
        </unconditionalExclude>
      </rules>
    </role>
  </component>
</migration>

我不确定我错过了什么。非常感谢任何帮助。提前致谢

您当前为每个循环迭代重新加载 XML,因此只有最后一个循环迭代会产生影响。 XML 应该在循环之前只加载一次。还要将 $xml.migration.component 保存在一个变量中,这样您就可以始终以相同的方式访问它,即使添加了更多元素(它变成了一个数组)也是如此。

$something = @(1, 2, 3, 4, 5, 5)

$xml = [xml]::new()
$xml.Load("C:\Temp\referenceXml.xml")

$component = $xml.migration.component

foreach($num in $something) {
    $drivething = "D:"
    $element = $component.clone()
    $xml.DocumentElement.AppendChild($element)
}

$xml.Save("C:\temp\newXML.xml")

附带说明,我已将 Get-Content 替换为 $xml.Load(),这样可以更好地处理 XML 编码。