2017-10-13 3 views
0

파일에서 데이터를 가져 오는 구문 분석 스크립트를 만듭니다. 일종의 자식 노드가 있거나 하나 이상의 자식 노드가있는 시나리오를 정상적으로 처리하기를 원합니다. 이 XML을 고려하십시오.하나 이상의 XML 노드가 있는지 확인하는 방법

<ClinicalDocument> 
    <recordTarget> 
    <patientRole> 
     <id></id> 
     <addr></addr> 
     <addr></addr> 
    </patientRole> 
    </recordTarget> 
</ClinicalDocument> 

아마 거기에만있는 하나 recordTarget, patientRole 및 ID에 셀 수 있지만, 구문 분석 스크립트 방탄를 만들기 위해, 나는 쉽게 각 노드에서 하나 이상이 있는지를 테스트 할 수 있도록하려면 레벨에서 데이터를 가져 오기 전에 하나의 <id>가있는 경우 예를 들어, 내가 파일의 두 <id>의가있는 경우,

$xpath = $xml.ClinicalDocument.recordTarget 
$id = $xpath.patientRole.id.extension 

그러나 ...이 같은 데이터를 가져 오는 것,이 같은 데이터를 끌어 할 필요가 ...

$xpath = $xml.ClinicalDocument.recordTarget 
$id = $xpath.patientRole.id[1].extension 

나는 foreach는 각 노드에 액세스 할 수 있지만 난 단지마다 각 <id>의 첫 번째 인스턴스를 원하는 경우가 쓰레기처럼 보인다. 컬렉션의 단일 항목 대 여러 항목을 처리하는 더 좋은 방법이 있습니까?

답변

0

첫 번째 요소를 선택하고 extension 값을 지정하면 Select-Object을 사용할 수 있습니다.

하나만 있으면 그 중 하나만 선택하면됩니다.

단일

$xml = [xml] @" 
<ClinicalDocument> 
    <recordTarget> 
    <patientRole> 
     <id extension = "A"></id> 
     <addr></addr> 
     <addr></addr> 
    </patientRole> 
    </recordTarget> 
</ClinicalDocument> 
"@ 

멀티

$xml = [xml] @" 
<ClinicalDocument> 
    <recordTarget> 
    <patientRole> 
     <id extension = "A"></id> 
     <id extension = "B"></id> 
     <id extension = "C"></id> 
     <addr></addr> 
     <addr></addr> 
    </patientRole> 
    </recordTarget> 
</ClinicalDocument> 
"@ 
0

을 :

$xpath = $xml.ClinicalDocument.recordTarget 
$id = $xpath.patientRole.id | Select-object -First 1 -ExpandProperty extension 

가 나는 extension 속성을 가지고 있지 않은 귀하의 예제로 테스트하기 위해이 XMLS을 사용 예제에서 <extension> 태그가 누락되었습니다. 그래서 이런 식으로 추가 :

$xml = [xml]("<ClinicalDocument> 
    <recordTarget> 
    <patientRole> 
     <id> 
     <extension>foo</extension> 
     </id> 
     <id> 
     <extension>bar</extension> 
     </id> 
     <addr></addr> 
     <addr></addr> 
    </patientRole> 
    </recordTarget> 
</ClinicalDocument>") 

을 당신이 바로, 당신은 <patientRole>의 자식으로 첫 <id> 태그를 원하는 항상 원하는 얻을합니다. 이 같은 첫 번째 값을 뽑을 수 두 경우 모두

$recordTarget = $xml.ClinicalDocument.recordTarget 
$id = $recordTarget.patientRole.SelectNodes('//id')[0].extension 
0

:이 경우 XPath를 사용할 수 있습니다

.Extentionnode 또는 xml 파일이하지 않는 샘플로 attribute인지 불분명하다 확장을 포함하십시오.

이 경우에는 .Extentionattribute이다

$id = ($xpath.patientRole.id | Select -First 1).Extension 
:

경우
$id = $xpath.patientRole.id.Extension | Select -First 1 

.Extention가있다 node