2013-08-13 5 views
5

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.

Antwort

5

Das XML-Element definitiv ist "über die Leitung weitergegeben". Was Sie sehen, ist eine Besonderheit von format-table: Es sieht nur das erste Objekt in einer Liste, um herauszufinden, welche Spalten gedruckt werden sollen.

Dies ist hauptsächlich aus Leistungsgründen. Andernfalls müsste format-table die Liste zweimal durchlaufen - einmal um herauszufinden, welche Eigenschaften ausgegeben werden, und ein zweites Mal, um sie tatsächlich auszugeben. Außerdem sind die Einträge in einer Liste häufig einheitlich.

In allen anderen Fällen ist die Regel „explicit ist besser als implizite“ gilt:

$stuff.members.member | ft name, rank, serialnumber -AutoSize 
+1

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

Verwandte Themen