Как исправить «У этого документа уже есть узел« DocumentElement ».» - PullRequest
0 голосов
/ 21 октября 2019

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

Это то место, где я пытаюсь импортировать и добавить узел

if (Test-Path "$destination\log.xml" -PathType Leaf) {
    [xml]$xml = Get-Content("$destination\log.xml")
    $element = $xml.ImportNode($doc.LastChild, $true)
    $xml.AppendChild($element)
}

и здесь я формирую узлы

[xml]$doc = New-Object System.Xml.XmlDocument #Sukuriam naują XML dokumentą
$root = $doc.CreateNode("element","Backups", $null)
$root.InnerText = (Get-Date).ToString()
foreach ($file in $failai) {
    $failasNode = $doc.CreateNode("element","Failas",$null)
    $pavadinimas = $doc.CreateElement("Saltinis") 
    $data = $doc.CreateElement("Data")
    $takas = $doc.CreateElement("Vieta")
    $busena = $doc.CreateElement("Busena")

    #some other stuff, that puts info in the elements

    $failasNode.AppendChild($pavadinimas)
    $failasNode.AppendChild($busena) 
    $failasNode.AppendChild($data) 
    $failasNode.AppendChild($takas) 
    $root.AppendChild($failasNode) 
}
$doc.AppendChild($root)

Строка

$xml.AppendChild($element)

возвращает сообщение об ошибке:

Этот документ ужеимеет узел DocumentElement.

1 Ответ

1 голос
/ 21 октября 2019

$xml.AppendChild() добавит элемент непосредственно под корнем документа, то есть в качестве корневого узла. Если в документе уже есть корневой узел, эта операция естественным образом завершится неудачей, поскольку документ XML не может иметь несколько корневых узлов.

<?xml version="1.0" encoding="utf-8"?>
<rootnode>
  <!-- stuff -->
</rootnode>
<strike><newnode>foo</newnode></strike>      <!-- &larr; invalid! -->

Чтобы устранить проблему, выберите узел, под которым вы хотите добавить импортированный узел. и вызовите AppendChild() на этом узле:

$xml.SelectSingleNode('/path/to/node').AppendChild(...)

Для добавления импортированного узла непосредственно под корневым узлом документа вы упростите приведенное выше:

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