PowerShell, объединяющий несколько файлов XML - PullRequest
0 голосов
/ 20 января 2019

Не знаю, почему у меня такие трудные времена, но я не могу понять, как объединить несколько файлов XML с помощью всеобъемлющей оболочки пакетов, чтобы я мог легко работать с данными.

XMLfile:

<package>
    <Application>Java</Application>
    <Version>8.0.2010.9</Version>
    <InstallType>Install</InstallType>
    <Installers>
        <Windows10>
            <Architecture>
                <x86>
                    <File1>
                        <FileName>jre-8u201-windows-i586.exe</FileName>
                        <Parameters>/s</Parameters>
                    </File1>
                </x86>
                <x64>
                    <file1>
                        <FileName>jre-8u201-windows-x64.exe</FileName>
                        <Parameters>/s</Parameters>
                    </file1>
                </x64>
                <AMD64>
                    <File1>
                        <FileName></FileName>
                        <Parameters></Parameters>
                        <CustomSuccessCodes></CustomSuccessCodes>
                        <CustomErrorCodes></CustomErrorCodes>
                    </File1>
                </AMD64>
            </Architecture>
        </Windows10>
    </Installers>
</package>

Что у меня есть:

$Path = "D:\Desktop\AutoInstall\Packages\Java v8u201\package.xml"
$Xml = New-Object Xml
#$Xml.AppendChild($XML.CreateXmlDeclaration("1.0", "UTF-8", $null)) | Out-Null
$Xml.AppendChild($Xml.CreateElement("Packages")) | Out-Null

$newxml = [xml](Get-Content $Path)
$Xml.ImportNode($newxml.get_DocumentElement(), $true) | Out-Null

$newNode = $newxml.ImportNode($Xml.get_DocumentElement(), $true)
$newxml.DocumentElement.AppendChild($newNode) | Out-Null
$Xml.packages

Когда я набираю $xml.packages, оно отображается пустым, когда должно получиться такой результат:

Application Version  InstallType Installers
----------- -------  ----------- ----------
Java        8.2.9.23 Install     Installers

1 Ответ

0 голосов
/ 20 января 2019

Ваш импорт идет в неправильном направлении. Вы импортируете новый созданный вами XML-документ ($xml) в XML-документ, загруженный из XML-файла. Если вы запустите $newxml.Save([Console]::Out), вы увидите узел <Packages /> прямо перед закрытием </package>.

<package>
    <Application>Java</Application>
    <Version>8.0.2010.9</Version>
    <InstallType>Install</InstallType>
    <Installers>
        ...
    </Installers>
    <Packages />       <!-- right here -->
</package>

Этот оператор импортирует $newxml, как вы хотели:

$xml.ImportNode($newxml.get_DocumentElement(), $true) | Out-Null

но вы сразу отбрасываете результат (Out-Null), а затем выполняете импорт в обратном направлении:

$newNode = $newxml.ImportNode($xml.get_DocumentElement(), $true)

Это будет делать то, что вы хотите:

$path = 'D:\Desktop\AutoInstall\Packages\Java v8u201\package.xml'

# create new XML document with <Packages> root node
$xml = New-Object Xml
$xml.AppendChild($xml.CreateElement('Packages')) | Out-Null

# load package XML from file and import it into $xml
$package = New-Object Xml
$package.Load($path)
$imported = $xml.ImportNode($package.DocumentElement, $true)
$xml.DocumentElement.AppendChild($imported) | Out-Null

$xml.Save([Console]::Out)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...