Powershell Копирование CDATA - PullRequest
       115

Powershell Копирование CDATA

1 голос
/ 13 апреля 2020

Я ищу решение, позволяющее копировать CDATA между XML файлами?

  • Я открываю два XML файла (oldfile. xml & newfile. xml)
  • Для каждого имени в старом файле. xml, обновите его значениями в новом файле. xml
  • Сохраните обновление в oldfile.upd. xml.

В приведенном ниже сценарии все работает нормально, пока не будет предпринята попытка скопировать значение, содержащее CDATA.

Сбой из-за ошибки:

  • Невозможно установить «значение», поскольку в качестве значений для установки свойств XmlNode могут использоваться только строки

Содержимое OldFile. xml:

<configuration>
        <mainsect>
                <subsect>
                        <setting name="Microsoft" retype="String">
                                <value>www.microsoft.com/old</value>
                        </setting>
                        <setting name="Apple" retype="String">
                                <value>www.apple.com/old</value>
                        </setting>
                        <setting name="Yahoo" retype="String">
                                <value>www.yahoo.com/older</value>
                        </setting>
                        <setting name="IBM" retype="String">
                <value><![CDATA[https://www.ibm.net/old/mycontainer?sv=2020-03-28%3D]]></value>
                        </setting>
                </subsect>
        </mainsect>
</configuration>

Содержимое NewFile. xml

<configuration>
    <mainsect>
        <subsect>
            <setting name="Microsoft" retype="String">
                <value>https://www.microsoft.com/new</value>
            </setting>
            <setting name="Apple" retype="String">
                <value>https://www.apple.com/new</value>
            </setting>
            <setting name="IBM" retype="String">
                <value><![CDATA[https://www.ibm.net/new/mycontainer?sv=2018-03-28%3D]]></value>
            </setting>
        </subsect>
    </mainsect>
</configuration>

Сценарий:

[XML] $oldObj = Get-Content "C:\temp\example\oldfile.xml"
[XML] $newObj = Get-Content "C:\temp\example\newfile.xml"

# ... Update old values with new values .....

$oldObj.configuration.mainsect.subsect.setting | % {

    foreach($elem in $newObj.configuration.mainsect.subsect.setting)
        {
        if ($_.Name -eq $elem.Name)  # found matching names, replace values
            {
            echo ("Updating {0}" -f $_.Name)

            $_.retype  = $elem.retype
            $_.value   = $elem.value   # !! Throws when hits CDATA in IBM !!

            break;
            }
        }
    }

$oldObj.Save("C:\temp\example\oldfile.upd.xml")

Я пробовал используя $ _. value.InnerText и не мог заставить ReplaceChild () работать правильно, но это может быть просто моей неопытностью.

Буду признателен за любую помощь.

...