2016-08-22 189 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