我在 Windows 8 PC 上使用 Powershell 3.0。我有一些简单的 XML 文件,其内容如下(没有 foobar 部分,稍后会出现):
<MyData>
<Version>1.2a</Version>
<Version foobar="1">3.4b</Version>
<Version>5.6c</Version>
</MyData>
现在,我已将所有版本提取到一个数组中,执行以下操作:
[xml] $FileData = Get-Content .\thefile.xml
[array]$theVersions = $FileData.MyData.Version | % {$_}
一切都运转良好,until我添加了foobar="1"
XML 文件——这似乎破坏了一切。我进行了一些挖掘,并尝试了涉及 #text 和 InnerText 的内容:
[array]$theVersions = $FileData.MyData.Version | % {$_.'#text'}
但是这个仅有效为了一块与 foobar 一起;另外两个似乎看不见。自然,我could向文件中的所有数据添加一些(任何)属性,但这不是一个可行的解决方案。
我的问题:有没有一致的方式从这些 XML 节点中读取 Value(或 #text、InnerText,无论您喜欢如何称呼它)是否存在属性吗?事实上,对于我的脚本来说,属性的存在或缺失需要被视为未知。
后续:由于 Keith 的建议和一些调整,我能够使用 Select-XML 来解决我的问题。由于我确实需要该属性(我最初忽略了该详细信息,因为我认为它并不重要),所以我最终得到了如下格式的内容:
[xml] $FileData = Get-Content .\thefile.xml
[array]$theVersions = (Select-Xml $FileData -XPath '//MyData/Version').Node | % {if ($_.foobar -ne $null) { "$($_.'#text') And Foobar $($_.foobar)"} else {$_.'#text'} }
$theVersions
结果输出:
1.2a
3.4b And Foobar 1
5.6c
感谢大家!希望这个问题及其解决方案对其他人有帮助!