2017-05-30 83 views
1

我有一个xml列表,我希望在<game>下添加一个新的子元素。我已经能够将子元素附加到游戏节点块的末尾,但对于命名标准,我需要将它插入图像元素之后作为图像的同胞。Powershell:在特定的当前兄弟元素之后添加新的XML元素

<image> 
<marquee> 

XML文档:

<?xml version="1.0" encoding="UTF-8"?> 
    <gameList> 
     <game id="2758" source="theGamesDB.net"> 
      <path>./Zelda II - The Adventure of Link (USA).zip</path> 
      <name>Zelda II - The Adventure of Link (USA)</name> 
      <desc>Removed description for example</desc> 
      <image>./boxart/Zelda II - The Adventure of Link (USA).png</image> 
      <rating>0.68333</rating> 
      <releasedate>19880926T000000</releasedate> 
      <developer>Nintendo</developer> 
      <publisher>Nintendo</publisher> 
      <genre>Action</genre> 
      <players>1</players> 
     </game> 
</gamelist> 

我的代码,在代码块的末尾添加选取框子元素。 注意:这是一个循环遍历大量游戏列表的循环。为了简单起见,我已经取出来创建选取框路径位置的代码和硬编码了。

#Set the name of the game list 
    $InputXML = "gamelist.xml" 
    $OutputXML = "MODgamelist.xml" 

    #Load the existing document 
    [xml]$xml = Get-Content $InputXML 

    foreach($game in $xml.gamelist.game) 
    { 

    #Set Marquee Path 
    $marqueelPath = "./Zelda II - The Adventure of Link (USA).png" 

    #Add marquee node to game node parent 
    $marqueeElement = $xml.CreateElement("marquee") 
    $marqueeElement.InnerText = $marqueelPath 
    $game.AppendChild($marqueeElement) 

    } 

    #Output 
    $xml.save($OutputXML) 

一些挖我想出了这个代码中插入图像后,新的子元素后却出现了错误。如何正确选择图像节点,然后插入它?

$imageElement = $game.SelectSingleNode('//image') 
$game.InsertAfter($marqueeElement, $imageElement) 

错误:

Exception calling "InsertAfter" with "2" argument(s): "The reference node is not a child of this node." 
At line:1 char:1 
+ $game.InsertAfter($marqueeElement, $imageElement) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

在此先感谢。

+0

'$ imageElement.ParentNode.InsertAfter($ marqueeElement,$ imageElement)'? – har07

+0

嗨Har07,谢谢你的建议。问题是它将它添加为图像的孩子。对不起,如果我没有在我的帖子中解释得很好。我编辑过它。我想的兄弟,并且在它之后插入。 –

+0

这就是该行应该做的事情,如果我没有错过任何东西:在'$ imageElement'之后添加'$ marqueeElement'作为'$ imageElement.ParentNode'的子元素。 – har07

回答

0

我在阅读MSDN文档并找出解决方案。 https://msdn.microsoft.com/en-us/library/k44daxya.aspx

由于所有的游戏节点块在布局上都是相同的,我实际上可以通过数组号来调用参考节点。

#Add marquee node to game node parent 
$marqueeElement = $xml.CreateElement("marquee") 
$marqueeElement.InnerText = $marqueelPath 
$game.InsertAfter($marqueeElement, $game.ChildNodes[3]) 
相关问题