Ich schreibe ein ziemlich umfangreiches Posh-Modul als CLI-Frontend für eine Reihe von RESTful Web Services. Ich habe ein seltsames Problem, das ich charakterisieren konnte, aber keine saubere Lösung gefunden habe.Powershell - Nicht alle XML-Attribute werden weitergegeben Pipeline
Ich weiß nicht immer, welche Attribute zu erwarten sind, und einige Knoten können ein bestimmtes Attribut haben, andere Knoten haben möglicherweise dieses Attribut nicht. Mein Problem ist manchmal (oft zu lesen), wenn ein Attribut nicht in allen Knoten vorhanden ist, wird es nicht in der Pipeline für irgendeinen Knoten weitergegeben. Es scheint damit in Beziehung zu stehen, welche Attribute im ersten Knoten im XML enthalten sind.
Für ein sehr einfaches Beispiel, dies prüfen, ist der Inhalt einer XML-Datei example.xml:
<members>
<member>
<name>Joe</name>
<rank>Grand Poobah</rank>
<serialnumber>1234</serialnumber>
</member>
<member>
<name>Fred</name>
<serialnumber>1234</serialnumber>
</member>
</members>
ich es importieren und ordnen sie in eine XML-Guss Variable:
[xml]$stuff = Get-Content .\example.xml
Dann ich lenke sie zu formatieren-Tabelle (oder out-gridview, export-csv, usw.)
$stuff.members.member | ft -AutoSize
name rank serialnumber
---- ---- ------------
Joe Grand Poobah 1234
Fred 1234
großen Werke.
Nun, wenn der erste Knoten nicht den Rang Attribut hat:
<members>
<member>
<name>Fred</name>
<serialnumber>1234</serialnumber>
</member>
<member>
<name>Joe</name>
<rank>Grand Poobah</rank>
<serialnumber>1234</serialnumber>
</member>
</members>
Nun, wenn ich den gleichen Import tun und es das Rohr umkippen, das „Rang“ Attribut wird die Pipeline nicht weitergegeben .
$stuff.members.member | ft -AutoSize
name serialnumber
---- ------------
Fred 1234
Joe 1234
Ich kann es erzwingen, indem explizit die Attribute Namensgebung:
$stuff.members.member | select-object -Property name, rank, serialnumber | ft
name rank serialnumber
---- ---- ------------
Fred 1234
Joe Grand Poobah 1234
Explizit die Attribute Namensgebung ist ein Rezept für Fehler, als Attribute ohne Warnung hinzugefügt werden können. Ich möchte den Code flexibel halten, um mit neuen Attributen umzugehen, wenn möglich.
Ich dachte, ich könnte "select-object -property *" verwenden, aber das fügt eine Menge Powershell eingefügt XML-Zeug, die ich nicht will, und noch nicht die Rang-Attribut.
$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 {}
Wer kennt die guten Möglichkeiten, mit dieser Situation umzugehen? Ich habe bei einer Google-Suche keine guten Hinweise gefunden.
Danke für die schnelle Antwort. Sie haben Recht, und Ihre Erklärung ist durchaus sinnvoll, aber sie gilt für viele Befehle wie export-csv, out-gridview.Ich habe gerade versucht, es zur Format-Liste zu leiten, die offensichtlich keine Spalten berechnen muss, die angezeigt werden sollen, und alle Attribute anzeigen. Also, du hast Recht, sie gehen alle aus dem Rohr. Vielen Dank! – user2678909