Powershell中的XML修改

时间:2015-03-24 09:06:26

标签: xml powershell

我使用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

我在这里做错了什么?

1 个答案:

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