我正在创建一个解析脚本来从文件中提取数据。我希望它能够优雅地处理只有一种子节点或多个子节点的场景。考虑这个XML。
<ClinicalDocument>
<recordTarget>
<patientRole>
<id></id>
<addr></addr>
<addr></addr>
</patientRole>
</recordTarget>
</ClinicalDocument>
我可能指望只有一个recordTarget,patientRole和ID,但为了使解析脚本具有防弹性,我希望能够在我尝试之前轻松测试每个节点级别是否有多个从中提取数据。例如,如果只有一个<id>
,我会像这样提取数据......
$xpath = $xml.ClinicalDocument.recordTarget
$id = $xpath.patientRole.id.extension
但是,如果文件中有两个<id>
,我需要像这样提取数据......
$xpath = $xml.ClinicalDocument.recordTarget
$id = $xpath.patientRole.id[1].extension
我可以使用foreach访问每个节点,但如果我只想要每个<id>
的第一个实例,那似乎就是浪费。有没有更好的方法来处理集合中的单个项目和多个项目?
答案 0 :(得分:0)
您可以使用Select-Object
,指定应选择第一个元素,并指定extension
属性的值。
如果只有一个,它只会选择那个。
$xpath = $xml.ClinicalDocument.recordTarget
$id = $xpath.patientRole.id | Select-object -First 1 -ExpandProperty extension
我使用这些xmls进行测试,因为您的示例没有extension
属性:
<强>单强>
$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>
"@
答案 1 :(得分:0)
您的示例中缺少<extension>
标记。所以我这样添加:
$xml = [xml]("<ClinicalDocument>
<recordTarget>
<patientRole>
<id>
<extension>foo</extension>
</id>
<id>
<extension>bar</extension>
</id>
<addr></addr>
<addr></addr>
</patientRole>
</recordTarget>
</ClinicalDocument>")
如果我找到了你,你想要第一个<id>
标签作为<patientRole>
的孩子。在这种情况下,您可以使用XPath:
$recordTarget = $xml.ClinicalDocument.recordTarget
$id = $recordTarget.patientRole.SelectNodes('//id')[0].extension
答案 2 :(得分:0)
在这两种情况下,您都可以像这样拉出第一个值:
目前尚不清楚.Extention
是node
还是attribute
,因为示例xml
文件不包含扩展名。
如果.Extention
是attribute
:
$id = $xpath.patientRole.id.Extension | Select -First 1
如果.Extention
是node
:
$id = ($xpath.patientRole.id | Select -First 1).Extension