【发布时间】:2017-02-11 12:41:04
【问题描述】:
要在 powershell 中获取 XML 元素的值,我们可以通过将元素视为 PowerShell 对象的属性来简单地写出路径;即$xml.RootElement.ChildElement.GrandChild。
但是,如果我们感兴趣的元素具有关联的属性,那么要获取文本值,我们需要深入到文本节点;即$xml.RootElement.ChildElement.GrandChild.'#text'。
遗憾的是,当元素没有属性时,我们不能使用文本节点;即在那种情况下,$xml.RootElement.ChildElement.GrandChild.'#text' 不起作用。
Clear-Host
$example = [xml](@"
<demo>
<element attribute='1'>10</element>
<element>20</element>
</demo>
"@)
"just the element"
$example.demo.element
"element's text"
$example.demo.element.'#text'
我为此编写了一个令人讨厌的解决方法,但怀疑这是错误的方法/PowerShell 有更优雅的方法来解决此问题。
我讨厌的解决方法:
function Get-TextNode {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline = $true)]
$xmlElement
)
process {
if($xmlElement.Attributes.Count -eq 0) {
$xmlElement
} else {
$xmlElement.'#text'
}
}
}
$example.demo.element | Get-TextNode
【问题讨论】:
-
ps。我注意到在我的命令中添加
$xmlElement.GetType()表明元素的类型会根据是否存在任何属性而改变;即如果他们是XmlElement,如果没有,那就是String..
标签: xml powershell xpath powershell-4.0 xml-attribute