使用PowerShell的OuterXml提取XML中John Doe字符串失败问题
问题分析与解决方案
你遇到的问题核心在于**OuterXml返回的是字符串类型,而非XML节点对象**,所以当你对字符串使用Select-Object Empl-Name时,PowerShell找不到对应的属性,自然没有输出结果。
先拆解你的代码逻辑:
- 正常输出的场景:
$user.myFields是原生的XML节点对象,它本身携带Empl-Name属性,所以Select-Object能精准提取对应值。 - 无输出的场景:
$user.myFields.OuterXml把节点转换成了纯XML格式的字符串(类似<my:myFields ...><my:Empl-Name>John Doe</my:Empl-Name></my:myFields>),字符串不存在Empl-Name这个属性,Select-Object自然返回空。
如果你确实需要基于OuterXml提取值(比如处理字符串形式的XML),可以这样做:
把OuterXml生成的字符串重新转换为XML对象,再提取属性:
# 将OuterXml字符串转回XML对象 $nameXml = [xml]($user.myFields.OuterXml) # 再从新的XML对象中提取属性 $name = $nameXml.myFields | Select-Object Empl-Name $name
执行后就能得到预期输出:
Empl-Name --------- John Doe
更直接的简化方案(如果不需要OuterXml的话):
如果你只是想提取Empl-Name的值,完全不需要借助OuterXml,直接访问节点属性即可:
# 直接获取属性的字符串值 $name = $user.myFields.'Empl-Name' $name # 输出:John Doe # 或者保持Select-Object的结构化输出 $name = $user.myFields | Select-Object 'Empl-Name' $name
小提示:
因为属性名包含连字符-,在PowerShell中访问这类属性时,最好用单引号把属性名括起来('Empl-Name'),避免PowerShell把连字符解析成运算符。
内容的提问来源于stack exchange,提问作者9
相关产品推荐
相关产品推荐

