2009-08-10 4 views
2

Ich schreibe einen PowerShell-Wrapper für ein vorhandenes Perl-Skript. Das Perl-Skript erhält eine Reihe von Parametern und schaltet alle unsere HP iLO-Geräte für uns aus und konfiguriert die Ergebnisse in einem XML-Format. Das Problem ist das Ergebnis herauskommt als eine große Blob von mehreren XML-Anweisungen, dh:Wie kann ich eine Zeichenfolge mit mehreren XML-Stammelementen in PowerShell auflösen?

$strResult = & "perl locfg.pl -s $iloInterface -f $configXML" 

<?xml version="1.0"?> 
<RIBCL VERSION="2.22"/> 
    <RESPONSE 
    STATUS="0x0000" 
    MESSAGE='No error' 
    /> 
</RIBCL> 

<?xml version="1.0"?> 
<RIBCL VERSION="2.22"/> 
<RESPONSE 
    STATUS="0x0000" 
    MESSAGE='No error' 
    /> 
</RIBCL> 

usw.

, um dann die $strResult werfen Der Versuch, XML-Ergebnisse in Fehler: „Es gibt mehrere Stammelemente

Hat jemand irgendwelche Gedanken darüber, wie ich diese XML-Anweisungen in PowerShell aufteilen kann, um sie gültig zu machen? Ich dachte, vielleicht ein Dummy-Stammelement in Ordnung? Oder sollte ich das zugrunde liegende Perl-Skript optimieren?

Antwort

1

Ich denke, es ist am einfachsten zu teilen bei der XML-Deklaration <?xml .... Zunächst einmal sind die XML nicht als einzelne string bekommen, sondern als String[], also müssen wir diese beitreten:

[string]::Join("`n", $strresult) 

ETA: Der join Betreiber in Powershell neu war 2, änderte ich es mit [string]::Join.

Wir können dann teilen Sie sie in der XML-Deklaration auf:

-split "<\?xml" 

Jetzt bekommen wir mehrere Strings zurück, von denen jeder entweder leer ist (für die erste) oder enthält XML mit einer verstümmelten Erklärung. Zunächst lassen Sie sich die leeren Streifen aus:

| ? { $_.Trim() } 

Dies wird die Zeichenfolge suchen, ob nicht leer ist, nachdem alle Leerzeichen entfernen. Jetzt müssen wir die Erklärung zurück hinzuzufügen, in der wir ausgezogen:

| % { "<xml$_" } 

Und jetzt können wir auch auf XML-Stimmen:

| %{ [xml] $_ } 

ist jedoch zu beachten, dass Ihre ursprüngliche XML falsch war zu beginnen. <RIBCL VERSION="2.22"/> ist ein selbst schließendes Wurzelelement und nach dem RESPONSE Element schließen Sie das RIBCL Element wieder.Als ich die / am Ende des gesamten RIBCL Element Öffnung entfernen funktioniert:

 
PS Home:\> (gc t.txt) -join "`n" -split "<\?xml" | 
>> ? { $_.Trim() } | 
>> % { "<?xml$_" } | 
>> % { [xml] $_ } 
>> 

xml               RIBCL 
---               ----- 
version="1.0"            RIBCL 
version="1.0"            RIBCL

ETA: Wenn Sie sich darauf verlassen können, dann ist es sicherlich einfacher, auf die leere Zeile zu spalten, aber:

[string]::Join("`n", $strResult) -split "`n`n" 
+0

Danke. Dies ist sicherlich das, was ich suche :) Ich werde in der Tiefe ein wenig mit Powershell geworfen, aber ich denke, es ist fantastisch im Vergleich zu Vbscript;) Ich werde dies ausprobieren, wenn ich morgen arbeiten werde:) –

+0

Sie können wahrscheinlich auch einfach auf die leere Zeile aufteilen, mit '-split '' n'n' ', aber ich wusste nicht, ob diese Zeile zwischen den einzelnen XML-Segmenten immer leer wäre und ob keine leeren Zeilen wären erscheinen in ihnen. Also entschied ich mich an einem Punkt zu trennen, an dem es eindeutig ein XML-Ausgangspunkt ist. – Joey

+0

Hallo Johannes, versuche oben zu replizieren, bekomme ich die folgende Fehlermeldung: PS D: \ iLO Skripte> (gc. \ Xmlsample.txt) -join "' n "-split" <\? Xml "| Sie müssen einen Wertausdruck auf der rechten Seite des Operators '-' angeben. Bei Zeile: 1 Zeichen: 23 + (gc. \ Xmlsample.txt) -j <<<< oin "' n "-split" <\? Xml "| –

0

Entweder die Perl-Funktion optimieren oder ein Root-Element umschließen, sollte funktionieren. Sie können den zurückgegebenen Wert auch auf die leeren Zeilen aufteilen und dann ein Array von XML-Objekten erstellen.

Eigentlich bin ich mir nicht sicher, ob ein Root-Element funktionieren würde, da jedes dieser Bits einen Versionsknoten enthält.

0

Ein anderer Weg, der für mich funktioniert, ist ein Wurzelelement um die gesamte Ausgabe zu wickeln und die Versionierungselemente zu entfernen. Dies wird für mich mit dem SAX-Parser korrekt analysiert für Java

Verwandte Themen