异常调用" InsertBefore"。引用节点不是此节点的子节点

时间:2016-05-03 06:06:03

标签: xml powershell

我尝试使用PowerShell在现有节点之前插入新节点,但是我收到以下错误:

  

异常调用" InsertBefore"用" 2"参数:"参考节点不是该节点的子节点。"

我的XML文档的结构是

<config>
    <services>
        <serviceType1>
            <id>uniqueKey_1</id>
            <val>nonUniqueValue</val>
        </serviceType1>
        <serviceType1>
            <id>uniqueKey_2</id>
            <val>nonUniqueValue</val>
        </serviceType1>
        <serviceType2>
            <id>uniqueKey_4</id>
            <val>nonUniqueValue</val>
        </serviceType2>
        <serviceType2>
            <id>uniqueKey_5</id>
            <val>nonUniqueValue</val>
        </serviceType2>
    </services>
</config>

XML文档可以包含任意数量的serviceType1 \ 2节点,我必须通过id识别它们的唯一方法。

我想要实现的目标如下:

<config>
    <services>
        <serviceType1>
            <id>uniqueKey_1</id>
            <val>nonUniqueValue</val>
        </serviceType1>
        <serviceType1>
            <id>uniqueKey_2</id>
            <val>nonUniqueValue</val>
        </serviceType1>
        <serviceType1>
            <id>uniqueKey_3</id>
            <val>nonUniqueValue</val>
        </serviceType1>
        <serviceType2>
            <id>uniqueKey_4</id>
            <val>nonUniqueValue</val>
        </serviceType2>
        <serviceType2>
            <id>uniqueKey_5</id>
            <val>nonUniqueValue</val>
        </serviceType2>
    </services>
</config>

是在具有子ID&#34; uniqueKey_4&#34;的serviceType2节点之前插入另一个包含它的子节点的serviceType1。

同样,我唯一的参考点是id值。

我的代码是;

$missingNode = "serviceType1"
$newElement = $myXMLDoc.CreateElement($missingNode) 
$myXMLDoc.DocumentElement.InsertBefore($newElement,$myXMLDoc.SelectSingleNode("//id[.='uniqueKey_4']").ParentNode)

我认为(错误地看来)SelectSingleNode(...).ParentNode会通过id给我一个serviceType2节点的引用。

1 个答案:

答案 0 :(得分:0)

@PetSerAl试图告诉您的是,您需要在要插入新节点的节点的父节点上调用InsertBefore()方法。在您的情况下,不是DocumentElement节点(即<config>),而是它的子节点<services>

将您的上一个陈述更改为以下内容:

$myXMLDoc.DocumentElement.services.InsertBefore($newElement, $myXMLDoc.SelectSingleNode("//id[.='uniqueKey_4']").ParentNode)

或者像这样:

$myXMLDoc.SelectSingleNode('//services').InsertBefore($newElement, $myXMLDoc.SelectSingleNode("//id[.='uniqueKey_4']").ParentNode)