首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PowerShell从xml获取XML文本值时智能处理属性

使用PowerShell从xml获取XML文本值时智能处理属性
EN

Stack Overflow用户
提问于 2016-10-03 14:17:46
回答 1查看 89关注 0票数 0

要在powershell中获取XML元素的值,我们可以简单地将项目看作是PowerShell对象的属性,即$xml.RootElement.ChildElement.GrandChild,从而写出路径。

但是,如果我们感兴趣的元素有一个相关的属性,那么要获取文本值,我们需要深入到文本节点,即$xml.RootElement.ChildElement.GrandChild.'#text'

遗憾的是,当元素没有属性时,我们不能使用文本节点;也就是说,在这个场景中,$xml.RootElement.ChildElement.GrandChild.'#text' 不工作

代码语言:javascript
复制
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有一种更优雅的方法来解决这个问题。

我讨厌的解决办法:

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-03 14:27:17

SelectNodes函数就是围绕这个问题工作的:

代码语言:javascript
复制
$example.SelectNodes('/demo/element').'#text'

代码语言:javascript
复制
$example.SelectNodes('/demo/element/text()').Value

按预期工作。

还可以以这种方式更新节点:

代码语言:javascript
复制
Clear-Host

$example = [xml](@"
<demo>
    <x>5</x>
    <element attribute='1'>10</element>
    <element>20</element>
</demo>
"@)

$example.OuterXml
#Result: <demo><x>5</x><element attribute="1">10</element><element>20</element></demo>

$example.SelectNodes('/demo/element/text()') | %{ 
    $_.value = $_.ParentNode.ParentNode.SelectSingleNode('./x/text()').Value  
}

$example.OuterXml
#Result: <demo><x>5</x><element attribute="1">5</element><element>5</element></demo>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39833815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档