fbook1610 0 Posted September 4 Report Share Posted September 4 Hallo zusammen. Ich bin sicherlich kein Profi was PowerShell betrifft. Aber so einiges habe ich bereits umsetzen können auch dank der Hilfe von diesem Forum. Ich bekomme von einem Lieferanten XML Dateien geliefert, die aber mehrere Inhalte beinhalten. Also so zusagen 4 Dateien in einem File. Die erhaltene Datei hat also 4 Zeilen wo jeweils "ALLES" drin steht. Also auch die XML Deklaration usw. Wenn ich nur eine Zeile benutze (den Rest also manuell lösche) dann kann ich alles einlesen und weiter verarbeiten. $xmlinhalt = New-Object System.XML.XMLDocument $xmlinhalt.Load("C:\test\test.xml") Ich muss jetzt eine Lösung finden wie jede Zeile als "eigenständiges" XML File verarbeitet wird. Ich hoffe man versteht was ich meine und jemand kann mir helfen. Gruß Frank Quote Link to comment
BOfH_666 577 Posted September 4 Report Share Posted September 4 (edited) Hmmm ... als nachhaltigeste Lösung würde ich versuchen, den Lieferanten dazu zu bringen standard-konforme XML-Dateien zu liefern. Als Workaround einfach die eine Datei in 4 aufsplitten. 🤷🏼♂️ ... oder eben mit einer Schleife jede Zeile einzeln "durchhühnern". Edited September 4 by BOfH_666 Quote Link to comment
fbook1610 0 Posted September 4 Author Report Share Posted September 4 @BofH_666 Das ich vom Lieferanten "vernümftige" Dateien bekommen hatte ich bereits erfolglos versucht. Die nennen das "multiple XML file". Angeblich wäre das "normal". Auch das mit Zeile mit einer foreach Schleife habe ich versucht, schient aber nicht zu gehen. Bekomme da folgende Fehlermeldung: Ausnahme beim Aufrufen von "Load" mit 1 Argument(en): "Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein. Davor sind keine Leerzeichen zulässig. Zeile 2, Position 3." In C:\Scripte\eingang.ps1:7 Zeichen:1 + $ovf.Load($files) + ~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException Und diese Meldung bekomme ich für jede Zeile. Wie würdest du das mit dem aufteilen machen? Quote Link to comment
testperson 1,623 Posted September 4 Report Share Posted September 4 Hi, du musst das komplette XML einlesen und dann zeilenweise durchgehen. Beispielsweise (PowerShell: StreamReader, ReadLine und leere Zeilen – Evgenij Smirnov – IT Pro aus Berlin (it-pro-berlin.de)): $sread = [System.IO.StreamReader]::new($file) while ($sread.EndOfStream -eq $false) { $line = $sread.ReadLine() $xmlinhalt = New-Object System.XML.XMLDocument $xmlinhalt.Load($line) } Ggfs. hilft es aber auch einfach mal eine Beispiel XML mit zwei, drei Zeilen hier zu posten. Gruß Jan Quote Link to comment
BOfH_666 577 Posted September 4 Report Share Posted September 4 (edited) vor 2 Stunden schrieb fbook1610: Wie würdest du das mit dem aufteilen machen? Im einfachsten Fall, wenn Du wirklich pro Zeile ein komplettes XML hast, etwa so: $DateiInhalt = Get-Content -Path 'C:\test\test.xml' $xmlinhalt = New-Object System.XML.XMLDocument foreach ($Zeile in $DateiInhalt) { $xmlinhalt.Load($Zeile) <# Hier Dein weiterer Code, um die XML-Inhalte zu verarbeiten #> } Edited September 4 by BOfH_666 Quote Link to comment
fbook1610 0 Posted September 4 Author Report Share Posted September 4 @testperson @BOfH_666 Bei beiden Lösungen bekomme ich schon beim einlesen folgende Fehlermeldung: Ausnahme beim Aufrufen von "Load" mit 1 Argument(en): "Illegales Zeichen im Pfad." In Zeile:8 Zeichen:5 + $xmlinhalt.Load($line) + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException Und diese Meldung kommt für jede vorhandene Zeile in der Datei. Habe mal ein Screenshot angehängt wie die Zeilenanfänge aussehen. Vielleicht hilft das. Quote Link to comment
daabm 1,303 Posted September 4 Report Share Posted September 4 Nö hilft nicht, weil das Ende fehlt... Womit hören die Zeilen auf? Also was ist der komplette Inhalt einer Zeile? Und nein, das ist NICHT standardkonform. Quote Link to comment
fbook1610 0 Posted September 4 Author Report Share Posted September 4 Die Datei enthält leider zu viele Daten die ich nicht veröffentlichen kann. Aber das Ende ist halt, das alle Tags wieder geschlossen werden. Wie gesagt ist jede Zeile eine vollwertige XML Datei. Quote Link to comment
BOfH_666 577 Posted September 4 Report Share Posted September 4 vor einer Stunde schrieb fbook1610: Und diese Meldung kommt für jede vorhandene Zeile in der Datei. Sagtest Du nicht 4 ("vier") Zeilen? vor 19 Minuten schrieb fbook1610: Die Datei enthält leider zu viele Daten die ich nicht veröffentlichen kann. Kürze doch die Datei einfach mal auf 2 oder 3 Zeilen und entferne oder tausche alle sensiblen Information aus. Wenn Du Fehlermeldungen postest, poste bitte dazu den kompletten Code, den Du benutzt hast und formatiere diesen auch als Code - nicht als Zitat! Wenn Du Beispiel-Daten postest, formatiere auch diese bitte als Code - Bilder von Code oder Fehlermeldungen oder Beispieldaten helfen uns nicht weiter. 1 Quote Link to comment
Solution mwiederkehr 372 Posted September 4 Solution Report Share Posted September 4 XmlDocument.Load erwartet einen Dateinamen oder einen Stream als Parameter. Will man einen String übergeben, muss man die Methode XmlDocument.LoadXml verwenden. 3 Quote Link to comment
fbook1610 0 Posted September 5 Author Report Share Posted September 5 @mwiederkehr Das hat es gebracht. Vielen lieben Dank. Hier mein Code $inhalt = Get-Content $file foreach ($zeile in $inhalt){ $ovf = New-Object System.XML.XMLDocument $ovf.LoadXML("$Zeile") #Weiterverarbeiten } Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.