如何将新的xml节点插入到空的父节点?

时间:2019-09-04 13:12:07

标签: xml powershell

这是我的xml文件结构:bookshelf.xml

<?xml version="1.0"?>
<Root>
  <bookshelf>
  </bookshelf>
</Root>

我只是想在空书架节点上插入一个新的XML节点,这是我的powershell脚本

$xmlPath = ".\bookshelf.xml"
[xml]$myXml = Get-Content -Path $xmlPath -Raw
$bookshelf =  $myXml.Root.bookshelf

$bookNode = $myXml.CreateElement("Book");
$bookNode.InnerText = "Book1";
$bookshelf.PrependChild($bookNode);
$myXml.Save($xmlPath)

我在运行时遇到以下异常

Method invocation failed because [System.String] does not contain a method named 'PrependChild'.
At powershell.ps1:7 char:1
+ $bookshelf.PrependChild($bookNode);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

我尝试调试并检查所选的xml节点是否为空,并且powershell认为它不是xml节点并且抛出异常。在空节点中添加了额外的节点后,它就可以工作了:

  <bookshelf>
    <test> testdata <test>
  </bookshelf>

但是我不喜欢这种情况,它应该能够向空标签插入一个新节点。有人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:1)

PowerShell具有一些用于xml文档的帮助程序功能-您的$bookshelf = $myXml.Root.bookshelf返回的是bookshelf元素的 InnerText ,而不是元素本身。

如果您执行此操作,它将返回元素...

$bookshelf = $myXml.SelectSingleNode("/Root/bookshelf")

,然后您的示例其余部分将创建一个xml文档,如下所示:

<?xml version="1.0"?>
<Root>
  <bookshelf>
    <Book>Book1</Book>
  </bookshelf>
</Root>