Zahlen aus XML auslesen und speichern lassen
Hallo zusammen,
ich bin noch ein ziemlicher PowerShell-Neuling.
Ich bräuchte Hilfe bezüglich eines Scripts, welche mir aus einer XML bestimmte Zahlen ausliest und als "text.txt" speichert.
Anbei habe ich ein Bild angefügt, welches so eine XML-Datei zeigt.
Nun müsste die Zahl bei "Page ID="61" (also die 132150322340) ausgelesen werden und in eine Text-Datei geschrieben werden.
In einer XML können mehrere oder auch keine Zahlen vorkommen.
Der Unterschied zu den anderen Zahlen ist nur das Attribut "Paginator ID"
Bei den Zahlen die ich brauche, ist nur die ID 9000 und bei den anderen sind es zwei ID`s: 9000 und 5100.
Wenn es noch möglich sein sollte, wäre es gut, wenn die entstandene Text-Datei den gleichen Namen wie die XML-Datei bekommen würde.
(falls nötig, wäre der Name auch innerhalb der XML als Attribut hinterlegt.
Vielen Dank im Vorraus für die Hilfe
MfG
ich bin noch ein ziemlicher PowerShell-Neuling.
Ich bräuchte Hilfe bezüglich eines Scripts, welche mir aus einer XML bestimmte Zahlen ausliest und als "text.txt" speichert.
Anbei habe ich ein Bild angefügt, welches so eine XML-Datei zeigt.
Nun müsste die Zahl bei "Page ID="61" (also die 132150322340) ausgelesen werden und in eine Text-Datei geschrieben werden.
In einer XML können mehrere oder auch keine Zahlen vorkommen.
Der Unterschied zu den anderen Zahlen ist nur das Attribut "Paginator ID"
Bei den Zahlen die ich brauche, ist nur die ID 9000 und bei den anderen sind es zwei ID`s: 9000 und 5100.
Wenn es noch möglich sein sollte, wäre es gut, wenn die entstandene Text-Datei den gleichen Namen wie die XML-Datei bekommen würde.
(falls nötig, wäre der Name auch innerhalb der XML als Attribut hinterlegt.
Vielen Dank im Vorraus für die Hilfe
MfG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1548238294
Url: https://administrator.de/contentid/1548238294
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
26 Kommentare
Neuester Kommentar
$ordner = "D:\Ordner"
Get-ChildItem $ordner -File -Filter *.xml -pipelinevariable file | %{
Select-XML -Path $_.Fullname -XPath "//Attributes/Paginator[@ID='9000']" | %{$_.Node.innerText} | Select -Unique | Set-Content "$ordner\$($file.Basename).txt"
}
Habs oben mal auf Paginator Knoten eingeschränkt die nur die ID 9000 haben dachte die anderen brauchst du auch weil du die fett markiert hast ... Wird aus deiner Beschreibung leider nicht ganz eindeutig was du nun tatsächlich willst. Leider hast du auch nicht den eigentlichen XML-Teil im Klartext gepostet ...
S. Anpassung oben einfach nur im XPath String den "OR" Teil weglassen hätte man auch selbst sehen können ...
Zitat von @Haberl92:
jetzt werden immer noch alle Nummern angezeigt, da die anderen ja auch das Attribut zusätzlich haben.
Nö, ein Attribut mit dem Namen ID kann niemals zweimal in ein und dem selben Element vorkommen!jetzt werden immer noch alle Nummern angezeigt, da die anderen ja auch das Attribut zusätzlich haben.
Sowas hier
<Paginator ID="5100" ID="9000">
Bitte poste das XML im Klartext keine GUI-Interpretation! Danke.
Jupp genau das macht mein Code oben, er nimmt nur die Elemente die Paginator heißen und gleichzeitig das Attribut ID mit dem Wert 9000 besitzen, auf die Barcode-Knoten passt der XPath Filter ja überhaupt nicht, diese können also aus Prinzip gar nicht angezeigt werden...
"Paginator ID"
Nee "ID" ist hier das XML-Attribut im Element mit dm Namen Paginator bitte benutze die richtigen Termini!Zitat von @Haberl92:
wie es aber hier zu sehen ist, haben die Zahlen ja beide Attribute und werden durch deinen Code auch in die Text-Datei geschrieben.
Nein kann aus Prinzip meines Codes nicht sein weil der XPath Filter nur auf den Paginator-Knoten zutrifft, der Barcode-Knoten kann also niemals gematcht werden!!! Kopiere den Code nochmal hast wohl noch eine Version aus dem Cache ...<Attributes>
> <Barcode ID="5100" DataType="string">132150322357</Barcode>
> <Paginator ID="9000">132150322357</Paginator>
wie es aber hier zu sehen ist, haben die Zahlen ja beide Attribute und werden durch deinen Code auch in die Text-Datei geschrieben.
Falls du mir nicht glaubst bitte hier die Online-Demo
https://tio.run/##vVZpb9pAEP2Mf8Vq1YpPtvf0ERkCbRQF9UIJUqMeQi4s4ApsZJY0vX ...
https://tio.run/##vVZpb9pAEP2Mf8Vq1YpPtvf0ERkCbRQF9UIJUqMeQi4s4ApsZJY0vX ...
Zitat von @Haberl92:
ich glaube dir, aber mit dem Code, werden mir immer noch alle Nummern in die Text-Datei geschrieben.
Nöp hier nicht siehst du ja in der Online-Demo oben ...ich glaube dir, aber mit dem Code, werden mir immer noch alle Nummern in die Text-Datei geschrieben.
Hier nochmal ein etwas größerer Ausschnitt:
(für die Text-Datei wird der Code bei "Page ID="61"" benötigt)
? Du brauchst also nur die Nummer im Element Page also die "61", nicht den Inhalt von dem Knoten Paginator (132150322340)?(für die Text-Datei wird der Code bei "Page ID="61"" benötigt)
Wäre es nicht möglich, wenn man jetzt schon alle Nummern hat, dass man diejenigen mit den Attribut "Barcode ID" einfach wieder entfernt und die verbliebenen Nummern dann in die Textdatei schreibt?
Überflüssig weil es funktioniert, wie gesagt, es kann schon aus Prinzip des xPath Filters nicht sein das diese gematcht werden ! Außerdem sind die Nummern in deinen Beispielen in beiden Knoten sowohl im Barcode als auch im Paginator-Element gleich siehst du ja hoffentlich selbst . Du verwechselst da wohl was oder beschreibst es nicht zu 100% eindeutig, indem Fall mach doch mal ein IST SOLL Vergleich.
Mein letzter Versuch das zu interpretieren:
Das übernimmt den Inhalt nur von den Paginator-Knoten mit der ID=9000 und die auf der selben Ebene keinen Barcode Knoten haben, hoffe das ist jetzt das was du willst.
$ordner = "D:\Ordner"
Get-ChildItem $ordner -File -Filter *.xml -pipelinevariable file | %{
Select-XML -Path $_.Fullname -XPath "//Paginator[@ID='9000' and count(../Barcode)=0]" | %{$_.Node.innerText} | Set-Content "$ordner\$($file.Basename).txt"
}
"//Page[@ID='1']//Paginator[@ID='9000' and count(../Barcode)=0]"
Na den absichtlichen Fehler den ich eingebaut hatte hättest du auch selber sehen können, hatte die ID extra auf 61 gesetzt um zu sehen ob du auch mal dein Oberstübchen anstrengst und nicht nur copy n pastest ... wohl falsch gedacht ... Man sieht es wird mal wieder schnell Freitag 🐟
Vielleicht zur Abwechslung mal etwas über die XPath-Syntax informieren, damit lässt sich so ziemlich alles in XML Dokumenten adressieren sei es auch noch so komplex.
https://www.w3schools.com/xml/xpath_syntax.asp
Wenn man viel mit XML Dokumenten hantiert ist das Quasi ein Wissens-must have.
https://www.w3schools.com/xml/xpath_syntax.asp
Wenn man viel mit XML Dokumenten hantiert ist das Quasi ein Wissens-must have.
Zitat von @Haberl92:
Vielen Dank für den Tipp.
Ich bin eben bei PowerShell noch Neuling und wenn es um XML geht noch besserer Neuling.
Da kann ich überhaupt nicht sagen, wie Powershell damit umgeht.
Ich mache das meiste mit CMD. Nur bei XML muss es Powershell sein.
Vielen Dank für den Tipp.
Ich bin eben bei PowerShell noch Neuling und wenn es um XML geht noch besserer Neuling.
Da kann ich überhaupt nicht sagen, wie Powershell damit umgeht.
Ich mache das meiste mit CMD. Nur bei XML muss es Powershell sein.
XPath hat an sich nichts mit der Powershell zu tun , und das hier ist eigentlich der Hauptbestandteil, alles andere drum herum bleibt für die Verarbeitung mittels Schleife gleich.
Für XPath braucht man auch nicht unbedingt Powershell bei XML ist XSLT die wahre Goldgrube, das ist dann bestimmt nochmal den Faktor 50 schneller.