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 検索で良い手がかりが見つかりませんでした。