【问题标题】:How to fix "This document already has a 'DocumentElement' node."如何修复“此文档已经有一个 'DocumentElement' 节点。”
【发布时间】:2019-10-21 17:16:33
【问题描述】:

我一直在尝试为我的学校作业制作一个 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”节点。

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    $xml.AppendChild() 会将元素直接附加到文档根下,即作为根节点。如果文档已经有根节点,那么操作自然会失败,因为一个 XML 文档不能有多个根节点。

    <?xml version="1.0" encoding="utf-8"?>
    <rootnode>
      <!-- stuff -->
    </rootnode>
    <newnode>foo</newnode>      <!-- ← invalid! -->

    要解决此问题,请选择要在其下附加导入节点的节点并在该节点上调用AppendChild()

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

    为了将导入的节点直接附加到文档根节点下,您可以将上面的内容简化为:

    $xml.DocumentElement.AppendChild(...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多