2015-03-24 5 views
0

Я автоматизирую сравнение XML с помощью Powershell (4.0). Я нахожу проблему в XML-модификации. Мы должны взять производственный XML и реплицировать его в нерабочее. Некоторые значения узлов различны, поэтому мы не можем скопировать вставку. Ниже приведен пример XML-секции.XML-модификация в Powershell

Я должен сравнить раздел имена обоих файлов и внесите изменения в файл производства. Ниже мой код.

$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

Вы можете предоставить полный сценарий? Мне не хватает определения $ add_node –

+0

Да, я пропустил это. '$ Add_node = $ int_xml.importnode (" section ")' – catchvjay

+0

Строка в этом сообщении об ошибке не отображается нигде в предоставленном фрагменте. Есть ли еще код, который вы нам не дали? –

ответ

0

В случае сомнений прочитайте documentation. Вы не можете вызвать ImportNode() с одним строковым аргументом. Метод ожидает объект XmlNode и второй параметр, указывающий, должен ли клонированный узел также включать дочерние узлы. Кроме того, если вы фильтруете разделы из живой конфигурации для тех узлов, которые не присутствуют во внутренней конфигурации, вы можете не использовать continue внутри цикла. Кроме того, вам нужно добавить новый узел ниже configSections, а не в корень документа, и вы должны сохранить измененный документ только один раз после цикл закончен.

$int_sections = $int_xml.configuration.configSections.section.name 
$live_xml.configuration.configSections.section | ? { 
    $int_sections -notcontains $_.name 
} | % { 
    $node = $int_xml.ImportNode($_, $true) 
    [void]$int_xml.configuration.configSections.appendchild($node) 
} 
$int_xml.Save($int_web_config) 
+0

Спасибо Асгар за ваше время. Ваш код возвращает ошибку в методе appendchild. 'Ошибка метода, потому что [System.String] не содержит метода с именем 'appendchild'. В C: \ Users \ vijay.patel \ myscripts \ file_copy.ps1: 75 char: 3 + $ int_xml.configuration.configSections.appendchild ($ node) + ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: MethodNotFound' – catchvjay

+0

Предоставляя «xpath», я смог найти решение для него. В очередной раз благодарим за помощь. – catchvjay