Скопируйте узел XML из одного файла и добавьте его в другой файл XML - PullRequest
0 голосов
/ 30 мая 2018

Пожалуйста, помогите мне с сценарием PowerShell для:

  1. Удаление определенного узла <Section Name="APILibraries"> в Config-B.xml.

  2. Чтение определенного <Section Name="APILibraries"> узла из Config-A.xml.

  3. Добавление в config-B.xml со значением шага 2 out.

Блок кода 1 и 2 работают нормально.Я могу прочитать значение, а также удалить узел из config-B.xml.Однако в блоке кода 3 вторая последняя строка скрипта PowerShell выдает ошибку, как будто он не может импортировать нулевой узел.

Вот Config-A.xml, который является источником, и Config-B.xml является целью вместе со скриптом PowerShell.

Config-A.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
  <Data>
    <Section Name="APILibraries">
      <Item Name="TIMSS.API.User" Layer="User" Type="Custom" RootNamespace="TIMSS.API.User" FileName="TIMSS.API.User.dll" />
      <Item Name="TIMSS.API.User.Generated" Layer="User" Type="Generated" RootNamespace="TIMSS.API.User" FileName="Personify.API.User.Generated.dll" />
      <Item Name="TIMSS.API.Base" Layer="Base" Type="Custom" RootNamespace="TIMSS.API.Base" FileName="TIMSS.API.Base.dll" />
      <Item Name="TIMSS.API.Generated" Layer="Base" Type="Generated" RootNamespace="TIMSS.API.Generated" FileName="TIMSS.API.Generated.dll" />
      <Item Name="TIMSS.API.Core" Layer="Core" Type="Custom" RootNamespace="TIMSS.API.Core" FileName="TIMSS.API.Core.dll" />
    </Section>
  </Data>
</Configuration>

Config-B.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
  <Data>
    <Section Name="APILibraries">
      <Item Name="TIMSS.API.Base" Layer="Base" Type="Custom" RootNamespace="TIMSS.API.Base" FileName="TIMSS.API.Base.dll" />
      <Item Name="TIMSS.API.Generated" Layer="Base" Type="Generated" RootNamespace="TIMSS.API.Generated" FileName="TIMSS.API.Generated.dll" />
      <Item Name="TIMSS.API.Core" Layer="Core" Type="Custom" RootNamespace="TIMSS.API.Core" FileName="TIMSS.API.Core.dll" />
    </Section>
  </Data>
</Configuration>

Скрипт PowerShell:

###Code Block - 1 : Get Source XML <Section Name="APILibraries"> Node Value ###
$CustomWinClientConfigXmlSource = "SourcePath\Config.xml"

[xml]$SourceConfigXml = Get-Content -Path "$CustomWinClientConfigXmlSource" -Raw
$SourceXmlNode = $SourceConfigXml | Select-Xml -XPath "//Section[@Name='APILibraries']"
$SourceXmlOutput = Write-Output "$SourceXmlNode"
$SourceXMLNodeValue = "$SourceXmlOutput"


### Code Block - 2 : Get The Target XML <Section Name="APILibraries"> Node Value And Delete It ##
$WinClientConfigFiles = "Config.xml"
$CustomWinClientConfigXmlTarget = "TargetPath\$WinClientConfigFiles"
$Path = "$CustomWinClientConfigXmlTarget"

[Xml]$servicefactoryconfig = Get-Content -Path $Path -Raw
$old = $servicefactoryconfig.SelectSingleNode("/Configuration/Data/Section[@Name='APILibraries']")
$parent = $old.ParentNode
[void] $parent.RemoveChild($old)


### Code Block - 3 : Append The Target XML <Section Name="APILibraries"> With Source XML Node Value ##
try {
    $newNode = [Xml] @"
$SourceXMLNodeValue
"@
} catch {
    Write-Error -Message 'Ignoring The Error Message' -ErrorAction Ignore
}

[void] $parent.AppendChild($servicefactoryconfig.ImportNode($newNode.DocumentElement, $true))

$servicefactoryconfig.Save($path)
...