Создание вложенного узла XML - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь вывести результаты вызова API в предопределенную структуру XML. Я создаю XML в Powershell и добавляю объявление и корневой узел.

Я нашел способ добавить несколько дочерних узлов в другую запись SO. Достаточно глупо, я закрыл вкладку, в которой это было, прежде чем писать это, так что извините, у меня больше нет ссылки.

Как вы можете видеть ниже, корневой узел не является частью определения того, куда должны поступать запрашиваемые значения, он начинается на один уровень ниже корневого узла.

Позже другие элементы также будут добавлены в корневой узел.

То, как я это настроил, работает с циклом, добавляющим нужные мне узлы, когда я замечаю строку:

#$xmlDocument.AppendChild($xmlRoot) | Out-Null

Я получаю вывод:

<?xml version="1.0" encoding="UTF-8"?><DEF><GHJ><GHJ /></GHJ></DEF>

это выглядит нормально, но корневой элемент (очевидно) отсутствует (если я добавляю в эту отмеченную строку, я получаю сообщение об ошибке (переведено с немецкого): «В документе уже есть узел« DocumentElement ».»

Ожидаемый результат

<?xml version="1.0" encoding="UTF-8"?><ABC xmlns:xsi="http://www.w3.org 2001/XMLSchema-instance" noNamespaceSchemaLocation="Dummy.xsd"><DEF><GHJ><GHJ /></GHJ></DEF></ABC>

(Дубликат GHJ специально)

$config = @{Output = @{Root = "ABC"}}
$targetSplit = ("DEF\GHJ\GHJ").Split("\")

# Create XML document
[xml]$xmlDocument = New-Object System.Xml.XmlDocument

# Create XML declaration
$xmlDeclaration = $xmlDocument.CreateXmlDeclaration("1.0","UTF-8",$null) 

# Add declaration to XML document
$xmlDocument.AppendChild($xmlDeclaration)

# Create root node  
$xmlRoot = $xmlDocument.CreateElement($config.Output.Root)

# Add root attributes
$xmlRoot.SetAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
$xmlRoot.SetAttribute('xsi:noNamespaceSchemaLocation', 'Dummy.xsd')

#add root to the document
#$xmlDocument.AppendChild($xmlRoot) | Out-Null

$lastXMLElement = $xmlDocument

for($i = 0; $i -lt $targetSplit.Length; $i++) {

    $xmlElement = $xmlDocument.CreateElement($targetSplit[$i])
    $lastXMLElement = $lastXMLElement.AppendChild($xmlElement)

}      

$xmlDocument.OuterXml

1 Ответ

2 голосов
/ 01 ноября 2019

Измените эту часть непосредственно перед циклом:

#add root to the document
#$xmlDocument.AppendChild($xmlRoot) | Out-Null

$lastXMLElement = $xmlDocument

на:

#add root to the document
$lastXMLElement = $xmlDocument.AppendChild($xmlRoot)

В противном случае добавление дочерних элементов к $lastXMLElement будет означать добавление дополнительных корневых элементов в документ,и может быть только один корневой узел :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...