PowerShell使用带多属性过滤的XPath提取XML属性值并导出到CSV
解决方案
你之前的5种写法的问题分别为:
- AuthID1:直接返回了
ext:id元素对象,未提取属性值,导出CSV时只会输出对象类型 - AuthID2:
select extension返回的是包含extension属性的自定义PS对象,不是纯文本值 - AuthID3/4:XPath路径错误,
extension是ext:id的属性而非子元素,用路径/extension会查找子节点,因此返回空 - AuthID5:返回了XML属性对象,未提取其文本值,导出CSV时只会输出对象类型
你可以选择任意一种修正方案实现需求:
方案1:基于XPath属性查询直接取值
在你原有AuthID5的写法基础上,追加访问XML属性对象的Value属性即可拿到纯文本:
AuthID = $xmlData.SelectSingleNode("//ns:MyDocument/ext:asEntityIdentifier[@classCode='IDENT']/ext:id[@assigningAuthorityName='Some Auth Name']/@extension", $nsMngr).Value
方案2:PowerShell简化写法
利用PowerShell对XML对象的语法糖特性,拿到元素后直接点出属性值:
$idNode = $xmlData.SelectSingleNode("//ns:MyDocument/ext:asEntityIdentifier[@classCode='IDENT']/ext:id[@assigningAuthorityName='Some Auth Name']", $nsMngr) AuthID = $idNode.extension
完整修正后的脚本示例
# 读取XML文件内容 [xml]$xmlData = Get-Content -Path "C:\temp\mytest.xml" # 声明所需的XML命名空间 $nsMngr = New-Object System.Xml.XmlNameSpaceManager($xmlData.NameTable) $nsMngr.AddNamespace("ns", $xmlData.DocumentElement.NamespaceURI) # 默认命名空间 $nsMngr.AddNamespace("ext", "namespace1") # 构造要导出的自定义对象,增加判空避免节点不存在时报错 $extAttr = $xmlData.SelectSingleNode("//ns:MyDocument/ext:asEntityIdentifier[@classCode='IDENT']/ext:id[@assigningAuthorityName='Some Auth Name']/@extension", $nsMngr) $reqdData = [PSCustomObject]@{ AuthID = $extAttr ? $extAttr.Value : "" } # 导出到CSV文件 $reqdData | Export-Csv -Path $extractFile -NoTypeInformation -Force -Append
内容的提问来源于stack exchange,提问作者Shell D
相关产品推荐
相关产品推荐

