2016-08-22 238 views
0

我有一個XML文件,其中包含我想要刪除的<Notes>節點。刪除XML節點

<APPOrganisationUnits> 
    <APPOrganisationUnitsRow num="1"> 
    <OrganisationId>TEST1</OrganisationId> 
    <APPContactDetails> 
     <APPContactDetailsRow num="1"> 
     <Notes>Notes 1</Notes> 
     </APPContactDetailsRow> 
     <APPContactDetailsRow num="2"> 
     <Notes>Notes 2</Notes> 
     </APPContactDetailsRow> 
     <APPContactDetailsRow num="3"> 
     <Notes>Notes 3</Notes> 
     </APPContactDetailsRow> 
    </APPContactDetails> 
    </APPOrganisationUnitsRow> 
    <APPOrganisationUnitsRow num="2"> 
    <OrganisationId>TEST2</OrganisationId> 
    <APPContactDetails> 
     <APPContactDetailsRow num="1"> 
     <Notes>Notes 1</Notes> 
     </APPContactDetailsRow> 
     <APPContactDetailsRow num="2"> 
     <Notes>Notes 2</Notes> 
     </APPContactDetailsRow> 
    </APPContactDetails> 
    </APPOrganisationUnitsRow> 
</APPOrganisationUnits> 

對於<notes>節點的每個實例,我只是想將其刪除。我的代碼這運行但不刪除節點。

$XMLFile = "$Provider_Root\Processing\small.xml" 
$xml = [xml](Get-Content $XMLFile) 

foreach ($APPContactDetailsRow in $xml.APPOrganisationUnits.APPOrganisationUnitsRow.APPContactDetails) { 
    if ($APPContactDetailsRow.Item('Notes')) { 
     $APPContactDetailsRow.RemoveChild($_) 
    } 
} 
$xml.Save($XMLFile) 
} 

回答

2

當前對象變量($_)未填充到循環的上下文中。您需要將該子節點放入一個變量中,然後才能將其刪除。另外,僅僅因爲您在特定類型的節點之後命名變量不會通過此變量自動枚舉節點。您需要實際擴展節點。

更改此:

foreach ($APPContactDetailsRow in $xml.APPOrganisationUnits.APPOrganisationUnitsRow.APPContactDetails) { 
    if ($APPContactDetailsRow.Item('Notes')) { 
     $APPContactDetailsRow.RemoveChild($_) 
    } 
}

到這一點:

foreach ($APPContactDetailsRow in $xml.APPOrganisationUnits.APPOrganisationUnitsRow.APPContactDetails.APPContactDetailsRow) { 
    $n = $APPContactDetailsRow.Item('Notes') 
    if ($n) { 
     $APPContactDetailsRow.RemoveChild($n) 
    } 
}

隨着中說,這很可能是簡單與XPath expression選擇節點,並使用管道需要刪除它們:

$xml.SelectNodes('//AppContactDetailsRow/Notes') | ForEach-Object { 
    $_.ParentNode.RemoveChild($_) 
} 
+0

這兩種解決方案都工作得很好對我來說,但我會用第二種方法,因爲它看起來更清潔/更短。非常感謝 – zoomzoomvince