2016-08-22 3 views
0

제거하고자하는 노드가 <Notes> 인 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> 

난 그냥 그것을 제거 할. 이 코드는 실행되지만 노드를 제거하지 않습니다.

$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

현재 개체 변수 ($_)는 루프 컨텍스트에서 채워지지 않습니다. 자식 노드를 제거하기 전에 자식 노드를 변수에 넣어야합니다. 또한, 특정 유형의 노드 다음에 변수 이름을 지정했기 때문에이 변수를 통해 노드를 자동으로 열거하지 않습니다. 실제로 노드를 확장해야합니다.

변경이 : 그, 아마 XPath expression로 노드를 선택하고이를 삭제하는 파이프 라인을 사용하는 것이 더 간단 할 것이라고 말했다와

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

이에

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

:

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

두 가지 솔루션 모두 동일하게 작동합니다 나는 나를 위해 나를 깨끗하게/더 짧게 보이는 두 번째 방법을 사용합니다. 많은 감사 – zoomzoomvince