Powershell - 在另外两个节点之间插入节点

时间:2010-02-04 10:43:57

标签: powershell

我想在已经存在的2个其他节点之间插入一个节点。 在我的脚本中,我收到一个xml变量,我想更新这个。

前:

<mapping ...>
    <INSTANCE .. />
    <INSTANCE .. />
    <CONNECTOR .. />
    <CONNECTOR .. />
</mapping>

结果应为:

<mapping ...>
    <INSTANCE .. />
    <INSTANCE .. />
    <NEWINSERT .../>
    <CONNECTOR .. />
    <CONNECTOR .. />
</mapping>

当我使用appendChild时,插件总是在最后完成...

一个想法?

谢谢!

2 个答案:

答案 0 :(得分:12)

正如@Grhm回答的那样,你可以InsertAfter来做。我建议总是尝试将其传递给Get-Member以获得提示。

> $x = [xml]@"
<mapping>
    <INSTANCE a="abc" />
    <INSTANCE a="abc" />
    <CONNECTOR a="abc" />
    <CONNECTOR a="abc" />
</mapping>
"@

> $x | gm -membertype method

   TypeName: System.Xml.XmlDocument
Name                        MemberType Definition
----                        ---------- ----------
AppendChild                 Method     System.Xml.XmlNode AppendChild(System.Xml
..
ImportNode                  Method     System.Xml.XmlNode ImportNode(System.Xml.
InsertAfter                 Method     System.Xml.XmlNode InsertAfter(System.Xml
InsertBefore                Method     System.Xml.XmlNode InsertBefore(System.Xm
Load                        Method     System.Void Load(string filename), System
...
WriteTo                     Method     System.Void WriteTo(System.Xml.XmlWriter

> $newe = $x.CreateElement('newelement')
> $x.mapping.InsertAfter($newe, $x.mapping.INSTANCE[1])
> $x | Format-Custom

我个人认为gm(或Get-Member)是PowerShell中最有用的cmdlet;)

答案 1 :(得分:4)

我建议使用appendChild是你的问题 - 它会将节点附加到列表的末尾。

您可以改为使用InsertBeforeInsertAfter(假设您可以获取所需插入点任意一侧的节点的引用。

有关InsertAfterInsertBefore上的文档,请参阅MSDN。