我使用Powershell(4.0)自动进行XML比较。我发现XML修改有问题。我们必须采用Production XML并在非生产中进行复制。某些节点值不同,因此我们无法复制粘贴。下面是示例xml部分。
我必须比较两个文件的部分名称,并根据生产文件进行更改。以下是我的代码。
$live_web_config = "\dummy path\web.config"
$int_web_config = "\Script_test\web.config"
$live_xml = New-Object -TypeName XML
$int_xml = New-Object -TypeName XML
$live_xml.Load($live_web_config)
$int_xml.Load($int_web_config)
foreach ($sec in $live_xml.configuration.configSections.section.name)
{
$node = $int_xml.configuration.configSections.section | where {$_.name -imatch $sec }
if ($node)
{
continue
}
else
{
#write-host $sec "not found in int"
$add_node = $int_xml.importnode("section")
write-host $sec
$add_node = $live_xml.configuration.configSections.section | where {$_.name -eq $sec }
$int_xml.appendchild($add_node)
$int_xml.save($int_web_config)
}
}
此代码返回以下错误:
You cannot call a method on a null-valued expression.
At C:\Users\vijay.patel\myscripts\file_copy.ps1:86 char:3
+ $int_xml.section.appendchild($add_node)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
我在这里做错了什么?
答案 0 :(得分:0)
如有疑问,请阅读documentation。您不能使用一个字符串参数调用ImportNode()
。该方法需要一个XmlNode
对象和一个第二个参数,指示克隆节点是否也应包含子节点。此外,如果您从实时配置中筛选内部配置中不存在的节点的部分,则可以避免在循环内使用continue
。另外,您需要在configSections
下面添加新节点,而不是在文档根目录中,并且应该在循环完成之后一次保存修改后的文档。
$int_sections = $int_xml.configuration.configSections.section.name
$live_xml.configuration.configSections.section | Where-Object {
$int_sections -notcontains $_.name
} | ForEach-Object {
$node = $int_xml.ImportNode($_, $true)
[void]$int_xml.configuration.configSections.AppendChild($node)
}
$int_xml.Save($int_web_config)