2016-11-18 1 views
0

I-Knoten mit dem Namen „ProjectOptions“ kopieren müssen von default.xml ohne log_alt.xml etwas zu modifizieren anderes:Import-Knoten von einem XML zum anderen auf Powershell

log_alt.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<KEYS> 
    <KEY ObjectName="computername_user" RegObjectType="0"> 
    <KEYS> 
     <KEY ObjectName="Desktop" RegObjectType="0"> 
     <KEYS> 
      <KEY ObjectName="Settings" RegObjectType="0"> 
      <KEYS> 
       <KEY ObjectName="PrinterDefault" RegObjectType="0"> 
       <VALUES> 
        <VALUE ObjectName="PrinterOrientation" Value="2" ValueType="4" /> 
       </VALUES> 
       </KEY> 
       <KEY ObjectName="ProjectOptions" RegObjectType="0"> 
       <VALUES> 
        <VALUE ObjectName="ShowWelcomeMsg" Value="0" ValueType="4" /> 
       </VALUES> 
       </KEY> 
      </KEYS> 
      </KEY> 
     </KEYS> 
     </KEY> 
    </KEYS> 
    </KEY> 
</KEYS> 

Standard .xml

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<KEYS> 
    <KEY ObjectName="computername_user" RegObjectType="0"> 
    <KEYS> 
     <KEY ObjectName="Desktop" RegObjectType="0"> 
     <KEYS> 
      <KEY ObjectName="Settings" RegObjectType="0"> 
      <KEYS> 
       <KEY ObjectName="PrinterDefault" RegObjectType="0"> 
       <VALUES> 
        <VALUE ObjectName="PrinterOrientation" Value="2" ValueType="4"/> 
       </VALUES> 
       </KEY> 
       <KEY ObjectName="ProjectOptions" RegObjectType="0"> 
       <VALUES> 
        <VALUE ObjectName="GSAddBatchOptionDialogRect" Value="381,203,981,629" ValueType="2"/> 
        <VALUE ObjectName="GSHeadNodeName" Value="" ValueType="2"/> 
        <VALUE ObjectName="GSIsAdvancedMode" Value="1" ValueType="4"/> 
        <VALUE ObjectName="GSRemoteSchedulerPlatform" Value="" ValueType="2"/> 
        <VALUE ObjectName="GSSchedulerName" Value="" ValueType="2"/> 
        <VALUE ObjectName="GSShowFrequentlyUsedBatchOptions" Value="1" ValueType="4"/> 
        <VALUE ObjectName="GSUserName" Value="" ValueType="2"/> 
        <VALUE ObjectName="ShowWelcomeMsg" Value="0" ValueType="4"/> 
       </VALUES> 
       </KEY> 
      </KEYS> 
      </KEY> 
     </KEYS> 
     </KEY> 
    </KEYS> 
    </KEY> 
</KEYS> 

ich habe versucht, so etwas wie dieses

$xml = [xml](Get-Content "C:\Temp\original.xml") 
$xmld = [xml](Get-Content "C:\Temp\default.xml") 
$Child=$xml.KEYS.KEY.KEYS.KEY.KEYS.KEY.KEYS.KEY[1].VALUES.VALUE 
$xml.DocumentElement.InsertAfter($XML.ImportNode($xmld.SelectSingleNode("//KEY[@ObjectName = 'ProjectOptions']"), $true), $Child) 
$xml.Save("C:\Temp\save.xml") 

Aber es endete mit "Der Referenzknoten ist kein Kind dieses Knotens." Bitte sagen Sie mir, wo ich falsch gelaufen bin. Danke.

Antwort

3

Sie versuchen, den importierten Knoten unter dem Knoten DocumentElement einzufügen, aber $Child ist kein direkt untergeordnetes Element dieses Knotens. Sie müssen die InsertAfter()-Methode auf dem übergeordneten Knoten von $Child aufrufen. diese

Wechsel:

$xml.DocumentElement.InsertAfter($XML.ImportNode($xmld.SelectSingleNode("//KEY[@ObjectName = 'ProjectOptions']"), $true), $Child) 

in diese:

$Child.ParentNode.InsertAfter($XML.ImportNode($xmld.SelectSingleNode("//KEY[@ObjectName='ProjectOptions']"), $true), $Child) 

und das Problem verschwindet.


Als Randbemerkung, sollten Sie für die Auswahl $Child statt Punktnotation einen XPath-Ausdruck verwenden:

$Child = $xml.SelectSingleNode('//VALUE[@ObjectName="ShowWelcomeMsg"]') 
0

einen einfachen Weg gefunden:

$xmlPO = $xml.SelectNodes("//KEY[@ObjectName='ProjectOptions']") 
$xmldPO = $xmld.SelectNodes("//KEY[@ObjectName='ProjectOptions']") 
$xmlPO.set_InnerXML($xmldPO.innerXML) 
$xml.Save($dpath)​ 
Verwandte Themen