删除 XML 个节点

Remove XML Node

我有一个 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)
}

当前对象变量 ($_) 未填充到您的循环上下文中。您需要先将子节点放入变量中,然后才能将其删除。此外,仅仅因为您在特定类型的节点之后命名变量不会自动通过该变量枚举节点。您需要实际扩展节点。

改变这个:

foreach($APPContactDetailsRow in $xml.APPOrganisationUnits.APPOrganisationUnitsRow.APPContactDetails){
    如果 (<b>$APPContactDetailsRow.Item('Notes')</b>) {
        $APPContactDetailsRow.RemoveChild(<b>$_</b>)
    }
}

进入这个:

foreach ($APPContactDetailsRow in $xml.APPOrganisationUnits.APPOrganisationUnitsRow.APPContactDetails<b>.APPContactDetailsRow</b>) {
    <b>$n = $APPContactDetailsRow.Item('Notes')</b>
    如果 (<b>$n</b>) {
        $APPContactDetailsRow.RemoveChild(<b>$n</b>)
    }
}

话虽如此,select 带有 XPath expression 的节点并使用管道删除它们可能会更简单:

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