Inhalt von XML-Dateien ändern
Hallo zusammen,
wir haben täglich viele XML-Dateien, die unter anderem jeweils eine Festplattengröße in Byte enthalten (Zeile 16).
Um die Datei weiterverarbeiten zu können, muss hier der gerundete Wert in GB stehen.
Die einfachste Lösung für uns wäre, in allen Dateien die letzten 9 Stellen des Wertes zwischen <entry name="capacity" type="uint">und </entry>zu löschen - ähnlich wie in Excel: =LINKS(A1;LÄNGE(A1)-9)
Ist das so möglich und könnt ihr mir weiterhelfen? Bin leider ein völliger Scrip-Neuling.
wir haben täglich viele XML-Dateien, die unter anderem jeweils eine Festplattengröße in Byte enthalten (Zeile 16).
Um die Datei weiterverarbeiten zu können, muss hier der gerundete Wert in GB stehen.
Die einfachste Lösung für uns wäre, in allen Dateien die letzten 9 Stellen des Wertes zwischen <entry name="capacity" type="uint">und </entry>zu löschen - ähnlich wie in Excel: =LINKS(A1;LÄNGE(A1)-9)
Ist das so möglich und könnt ihr mir weiterhelfen? Bin leider ein völliger Scrip-Neuling.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="report.xsl" type="text/xsl"?>
<reports>
....
<entries name="disks">
<entries name="disk">
<entry name="id" type="uint">36</entry>
<entry name="index" type="uint">1</entry>
<entry name="model" type="string">WD1600BEVT-75ZCT2</entry>
<entry name="vendor" type="string">WDC</entry>
<entry name="serial" type="string">WD-WXV0E49FWT12</entry>
<entry name="blocksize" type="uint">512</entry>
<entry name="interface_type" type="string">SATA</entry>
<entry name="average_write_speed" type="uint">57091590</entry>
<entry name="average_read_speed" type="uint">37463153</entry>
<entry name="capacity" type="uint">160041885696</entry>
....
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 269451
Url: https://administrator.de/forum/inhalt-von-xml-dateien-aendern-269451.html
Ausgedruckt am: 27.04.2025 um 21:04 Uhr
14 Kommentare
Neuester Kommentar
Hallo,
Gruß,
Peter
Zitat von @Kedi123:
Ist das so möglich und könnt ihr mir weiterhelfen? Bin leider ein völliger Scrip-Neuling.
Aber suchen kannst du? Noch gar nicht lange her Wert in mehreren XML Dateien per Script ersetzenIst das so möglich und könnt ihr mir weiterhelfen? Bin leider ein völliger Scrip-Neuling.
Gruß,
Peter
Hallo Kedi123,
oder auch mit Powershell schnell für einen ganzen Satz XML-Dateien gemacht...
Grüße Uwe
-edit- kleinere Korrekturen ...
oder auch mit Powershell schnell für einen ganzen Satz XML-Dateien gemacht...
$files = gci "C:\temp\*.xml"
$files | %{
$xml = new-Object XML
$xml.Load($_.Fullname)
$node = $xml.SelectSingleNode("//entry[@name='capacity']")
if($node){
$node.innerText = $node.innerText.Substring(0,$node.innerText.length - 9)
$xml.Save($_.Fullname)
}
}
-edit- kleinere Korrekturen ...
Die Selektionssprache nennt sich XPATH
Folgendes Selektiert den ersten entry Eintrag innerhalb eines Nodes mit dem Namen entries und einem Attribut disk
Da ich hier den kompletten Inhalt der XML-Datei bis zum EIntrag nicht vorliegen habe
ist das meine mögliche Version.
Folgendes Selektiert den ersten entry Eintrag innerhalb eines Nodes mit dem Namen entries und einem Attribut disk
$node = $xml.SelectSingleNode("//entries[@name='disk']/entry[@name='capacity']")
Zitat von @Kedi123:
jetzt verwirrst du mich völlig. Brauche ich ein Programm, um das Script auszuführen?
Gib mir doch bitte eine Anleitung für Dummies.
Nein Powershell ist in neueren Windows-Versionen ab Vista bereits enthalten. XPath ist nur für die Selektion des Nodes zuständig und das erledigt ja das NET-Framework der Powershell für dich.jetzt verwirrst du mich völlig. Brauche ich ein Programm, um das Script auszuführen?
Gib mir doch bitte eine Anleitung für Dummies.
Bitteschön...Wird oft nachgefragt, deshalb habe ich es schon auf Lager
Anleitung: Wie starte ich Powershell-Scripte
- Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
- Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine administrative Powershell-Konsole und gibt dort den Befehl
Set-ExecutionPolicy RemoteSigned -Force
ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden:Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
- Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
- Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy ByPass -File "C:\Pfad\Script.ps1"
Starten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:"C:\Pfad\script.ps1"
.\script.ps1
Starten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
powershell -?
in einer Konsole an.
Starten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"Zitat von @Kedi123:
mit deiner Anleitung konnte ich das Script ausführen.
In der ersten Variante werden die Dateien neu gespeichert aber nicht geändert, bei Version 2 passiert gar nix.
Wie gesagt ich habe nur dein gepostetes Schnippsel und damit geht es hier einwandfrei. Es ist wie immer als Powershell-Anfänger mit deiner Anleitung konnte ich das Script ausführen.
In der ersten Variante werden die Dateien neu gespeichert aber nicht geändert, bei Version 2 passiert gar nix.
Ich kann dir hier leider nur mit einem kompletten XML-File weiter helfen ! Der Pfad zum gewünschten Token ist hier essentiell wichtig.
Wahrscheinlich hast du den Pfad zu den XML.Dateien nicht angepasst, ich hoffe das aber doch stark ?!
Dann hat deine Zahl nicht genug Zeichen, das hattest du ja nicht erwähnt das dies der Fall sein kann, das muss man natürlich abfangen ...
$files = gci "C:\temp\demo2.xml"
$files | %{
$xml = new-Object XML
$xml.Load($_.Fullname)
$node = $xml.SelectSingleNode("//entries[@name='disk']/entry[@name='capacity']")
if($node){
if (($node.innerText.length - 9) -gt 0){
$node.innerText = $node.innerText.Substring(0,$node.InnerText.Length-9)
$xml.Save($_.Fullname)
}
}
}