删除XML节点

时间:2016-08-22 09:28:27

标签: xml powershell element

我有一个XML文件,其中包含我想删除的<Notes>节点。

<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)
}

1 个答案:

答案 0 :(得分: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($_)
}