2017-10-13 1 views
0

Ich erstelle ein Parsing-Skript, um Daten aus einer Datei zu extrahieren. Ich möchte, dass es Szenarien mit nur einer Art Kindknoten oder wenn es mehrere gibt. Betrachten Sie dieses XML.So ermitteln Sie, ob mindestens ein XML-Knoten vorhanden ist

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

ich wahrscheinlich dort nur als eine recordTarget, patientRole zählen konnte, und ID, aber das Parsen Skript kugelsicher zu machen, möchte ich in der Lage sein, einfach um zu sehen, zu testen, ob es mehr als eine an jedem Knoten ist Level, bevor ich versuche, Daten daraus zu ziehen. Zum Beispiel, wenn es nur ein <id>, würde ich zieht Sie die Daten wie das ist ...

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

jedoch, wenn es zwei <id> s in der Datei, ich brauche die Daten so ziehen ...

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

ich jeden Knoten mit einer foreach zugreifen konnte, aber es scheint, wie Abfall, wenn ich jeden nur die erste Instanz jedes <id> wollen. Gibt es eine bessere Möglichkeit, mit den einzelnen vs mehreren Elementen in einer Sammlung umzugehen?

Antwort

0

Sie können Select-Object verwenden, wobei das erste Element ausgewählt und der Wert der extension-Eigenschaft zugewiesen werden soll.

Wenn es nur einen gibt, wird nur dieser ausgewählt.

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

benutzte ich diese xmls als Beispiel zu testen, keine extension Eigenschaft hatte:

Einzel

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

Multi

$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

Die <extension> Tag fehlt in Ihrem Beispiel. So habe ich es so:

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

Wenn ich Dich richtig, Sie wollen immer den ersten <id> Tag als Kind von <patientRole>. In diesem Fall können Sie XPath verwenden:

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

In beiden Fällen können Sie erste Wert wie folgt ziehen:

Es ist unklar, ob die .Extention ist ein node oder attribute als Probe xml Datei nicht der Fall ist schließe die Erweiterung ein.

Bei der .Extention ist ein attribute:

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

Bei der .Extention ist ein node:

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