我正试图在同一文件中复制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;()+CategoryInfo:InvalidOperation:(克隆:字符串)[],RuntimeException+FullyQualifiedErrorId:InvokeMethodOnNull
使用"1"参数调用"AppendChild"时发生异常:"对象引用未设置为对象的实例。"在D:\Powershell MyScripts\test.ps1:7 char:34+$xdoc.DocumentElement.AppendChild<lt<lt;($NodeToClone)+CategoryInfo:未指定:(:)[],MethodInvocationException+FullyQualifiedErrorId:DotNetMethodException
您在XML路径中忘记了一个"s"(…Version.Version…而不是…Version.VVersion…)
$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)