5

RESTful Web サービスのセットに対する CLI フロントエンドとなる、かなり充実した Posh モジュールを作成しています。特性を特定できた奇妙な問題がありますが、明確な解決策が見つかりません。

どの属性が期待されるかは常にわかっているわけではなく、一部のノードには特定の属性があり、他のノードにはその属性がない場合があります。私の問題は、属性がすべてのノードに存在しない場合、時々 (読む: よく)、どのノードのパイプラインにも渡されないことです。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>

それをインポートして、xml キャスト変数に割り当てます。

[xml]$stuff = Get-Content .\example.xml

次に、それを format-table (または out-gridview、export-csv など) にパイプします。

$stuff.members.member | ft -AutoSize

name  rank          serialnumber
----  ----         ------------
Joe   Grand Poobah  1234
Fred                1234

よく働く。

ここで、FIRST ノードにランク属性がない場合:

<members>
    <member>
        <name>Fred</name>
        <serialnumber>1234</serialnumber>
    </member>
    <member>
        <name>Joe</name>
        <rank>Grand Poobah</rank>
        <serialnumber>1234</serialnumber>
    </member>
 </members>

ここで、同じインポートを実行してパイプに渡すと、「ランク」属性はパイプラインに渡されません。

$stuff.members.member | ft -AutoSize

name   serialnumber
----   ------------
Fred   1234
Joe    1234

属性に明示的に名前を付けることで強制できます。

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

name  rank          serialnumber
----  ----          ------------
Fred                1234
Joe   Grand Poobah  1234

属性は警告なしに追加される可能性があるため、属性に明示的に名前を付けることはバグのレシピです。可能であれば、新しい属性を処理できるようにコードを柔軟に保ちたいと考えています。

「select-object -property *」を使用できると思っていましたが、不要な PowerShell 挿入 XML が大量に追加され、それでもランク属性がパイプ処理されません。

$stuff.members.member | select-object -Property *| ft -AutoSize
name serialnumber LocalName NamespaceURI Prefix NodeType ParentNode OwnerDocument IsEmpty Attributes
---- ------------ --------- ------------ ------ -------- ---------- ------------- ------- ----------
Fred 1234         member                         Element members    #document       False {}
Joe  1234         member                         Element members    #document       False {}

この状況に対処する良い方法を知っている人はいますか? Google 検索で良い手がかりが見つかりませんでした。

4

1 に答える 1

5

XML 要素は間違いなく「パイプに渡されます」。あなたが見ているのはformat-table、リストの最初のオブジェクトだけを見て、どの列を印刷するかを判断するという特異性です。

これは主にパフォーマンス上の理由によるものです。それ以外の場合は、リストを 2 回format-table反復する必要があります。1回目は出力するプロパティを特定し、2 回目は実際にそれらを出力します。さらに、多くの場合、リスト内の項目は統一されています。

それ以外の場合はすべて、「明示的は暗黙的よりも優れている」というルールが適用されます。

$stuff.members.member | ft name, rank, serialnumber -AutoSize
于 2013-08-13T15:30:52.450 に答える