小编use*_*909的帖子

Powershell - 并非所有XML属性都传递给管道

我正在编写一个相当实质的Posh模块作为一组RESTful Web服务的CLI前端.我有一个奇怪的问题,我能够表征,但没有找到一个干净的解决方案.

我并不总是知道期望什么属性,并且一些节点可能具有某个属性,其他节点可能没有该属性.我的问题有时(经常阅读)如果一个属性不存在于所有节点中,它将不会传递给任何节点的管道.它似乎与XML中第一个节点中的属性有关.

对于一个非常简单的示例,请考虑这是XML文件example.xml的内容:

<members>
    <member>
        <name>Joe</name>
        <rank>Grand Poobah</rank>
        <serialnumber>1234</serialnumber>
    </member>
    <member>
        <name>Fred</name>
        <serialnumber>1234</serialnumber>
    </member>
 </members>
Run Code Online (Sandbox Code Playgroud)

我导入它并将其分配给xml铸造变量:

[xml]$stuff = Get-Content .\example.xml
Run Code Online (Sandbox Code Playgroud)

然后我把它管道到格式表(或out-gridview,export-csv等)

$stuff.members.member | ft -AutoSize

name  rank          serialnumber
----  ----         ------------
Joe   Grand Poobah  1234
Fred                1234
Run Code Online (Sandbox Code Playgroud)

效果很好.

现在,如果FIRST节点没有rank属性:

<members>
    <member>
        <name>Fred</name>
        <serialnumber>1234</serialnumber>
    </member>
    <member>
        <name>Joe</name>
        <rank>Grand Poobah</rank>
        <serialnumber>1234</serialnumber>
    </member>
 </members>
Run Code Online (Sandbox Code Playgroud)

现在,当我执行相同的导入并将其传递给管道时,"rank"属性不会传递给管道.

$stuff.members.member | ft -AutoSize

name   serialnumber
----   ------------
Fred   1234
Joe    1234
Run Code Online (Sandbox Code Playgroud)

我可以通过显式命名属性来强制它:

$stuff.members.member | select-object -Property name, rank, serialnumber | ft

name  rank          serialnumber
----  ---- …
Run Code Online (Sandbox Code Playgroud)

xml powershell

5
推荐指数
1
解决办法
338
查看次数

标签 统计

powershell ×1

xml ×1