PowerShell XML复制节点在同一文件中

时间:2016-05-24 10:42:10

标签: xml powershell

我想在同一个文件中复制xml节点但是我收到了错误。 请检查。

PowerShell脚本:

$path=".."
cd $path
[xml]$xdoc = Get-Content $path
$NodeToClone = $xdoc.root.Version.Version.Builds.Build.Clone()
$xdoc.DocumentElement.AppendChild($NodeToClone)
$xdoc.Save($path)

XML文件:

<root>
  <Versions>
    <Version Number="3">
      <Builds>
        <Build Number="205" Version="30">
          <Steps>
            <Step Number="1" Build="205" Version="3">
              <SubSteps>
                <SubStep Number="1" comment="" />
              </SubSteps>
            </Step>
            <Step Number="2" Build="205" Version="3">
              <SubSteps>
                <SubStep Number="1" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" />
                <SubStep Number="2" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" />
                </SubSteps>
            </Step>
            <Step Number="3" Build="205" Version="3">
              <SubSteps>
                <SubStep Number="1" comment="" />
              </SubSteps>
            </Step>
          </Steps>
        </Build>
      </Builds>
    </Version>
  </Versions>
</root>

我想复制下一个数字206的构建节点,但我收到以下错误:

  

您无法在空值表达式上调用方法。       在D:\ Powershell-MyScripts \ test.ps1:6 char:48       + $ NodeToClone = $ xdoc.root.Version.Version.Clone&lt;&lt;&lt;&lt; ()           + CategoryInfo:InvalidOperation :( Clone:String)[],RuntimeException           + FullyQualifiedErrorId:InvokeMethodOnNull

     

使用“1”参数调用“AppendChild”的异常:“对象引用未设置为对象的实例。”       在D:\ Powershell-MyScripts \ test.ps1:7 char:34       + $ xdoc.DocumentElement.AppendChild&lt;&lt;&lt;&lt; ($ NodeToClone)           + CategoryInfo:NotSpecified:(:) [],MethodInvocationException           + FullyQualifiedErrorId:DotNetMethodException

1 个答案:

答案 0 :(得分:1)

你忘记了&#39;在您的XML路径中(... Version.Version ...而不是...... Versions.Version ...)

$NodeToClone = $xdoc.root.Versions.Version.Builds.Build.Clone()  

此外,您可能希望更改节点以将克隆节点附加到

$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone)  

否则它与您之前的节点不在同一级别。

在评论中讨论后更新:

[xml]$xdoc = Get-Content $path
$NodeToClone = @($xdoc.root.Versions.Version.Builds.Build)[-1].Clone()  

$NodeToClone.Number = ([int]($NodeToClone.Number) + 1).ToString()
foreach ($step in $NodeToClone.Steps.Step) {
    $step.Build = $NodeToClone.Number   
}  

$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone)
$xdoc.Save($path)