XML Dateien per batch zusammenführen und Format bearbeiten
Hallo Zusammen,
ich möchte XML-Dateien zu einer Datei zusammenführen (Es sind mehrere 100 XML-Dateien mit wenig Inhalt).
Diese zusammengeführte Dateien sollen in Excel aus lesbar sein. Wie ein geeignetes XLM Format für Excel aussehen muss weiß ich. Manuell würde das jedoch zu lange dauern und ich versuche ein Batch Skript zu erstellen, welches die XML Dateien in eine zusammenfügt und das richtige Format anwendet. Die Daten sind auch nicht immer gleich und können sich auch ändern. Leider habe ich sehr wenig Erfahrung mit Batch Dateien und hoffe auf Hilfe
Dateibeispiel der einzelnen Dateien:
Die Dateien sollen dann zu einer zusammengeführt werden und so aussehen
Gibt es des weiteren auch gute Tutorials oder Lernzeiten wo man sein Wissen ausbauen kann zum genannten Thema?
Danke und Gruß
Krustenkaese
ich möchte XML-Dateien zu einer Datei zusammenführen (Es sind mehrere 100 XML-Dateien mit wenig Inhalt).
Diese zusammengeführte Dateien sollen in Excel aus lesbar sein. Wie ein geeignetes XLM Format für Excel aussehen muss weiß ich. Manuell würde das jedoch zu lange dauern und ich versuche ein Batch Skript zu erstellen, welches die XML Dateien in eine zusammenfügt und das richtige Format anwendet. Die Daten sind auch nicht immer gleich und können sich auch ändern. Leider habe ich sehr wenig Erfahrung mit Batch Dateien und hoffe auf Hilfe
Dateibeispiel der einzelnen Dateien:
<?xml version="1.0" encoding="UTF-8"?>
<a>
<NE NEFdn="NE=374" NEName="224" NEType="Test" />
<TABLES>
<TABLE attrname="HostVer">
<ROWDATA>
<ROW HostVerType="HOSTVER" HostVer="200" sDesc="" />
<ROW HostVerType="HOTPATCH" HostVer="237" sDesc="" />
</ROWDATA>
</TABLE>
</TABLES>
</a>
Die Dateien sollen dann zu einer zusammengeführt werden und so aussehen
<?xml version="1.0" encoding="UTF-8"?>
<a>
<NE NEFdn="NE=374" NEName="224" NEType="Test">
<table attrname="HostVer">
<row HostVerType="HOSTVER" HostVer="200" sDesc="" />
<row HostVerType="HOTPATCH" HostVer="237" sDesc="" />
</table>
</NE>
<NE NEFdn="NE=375" NEName="226" NEType="Test">
<table attrname="HostVer">
<row HostVerType="HOSTVER" HostVer="200" sDesc="" />
<row HostVerType="HOTPATCH" HostVer="237" sDesc="" />
</table>
</NE>
</a>
Gibt es des weiteren auch gute Tutorials oder Lernzeiten wo man sein Wissen ausbauen kann zum genannten Thema?
Danke und Gruß
Krustenkaese
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1756099898
Url: https://administrator.de/forum/xml-dateien-per-batch-zusammenfuehren-und-format-bearbeiten-1756099898.html
Ausgedruckt am: 16.05.2025 um 00:05 Uhr
9 Kommentare
Neuester Kommentar
Servus @Krustenkaese, willkommen auf Administrator.de!
Lass das mit Batch sein, das ist für XML die schlechteste Wahl überhaupt, mach es beispielsweise mit Powershell
Ich würde sowas zwar gleich mit XSLT machen aber ich wollte dich damit jetzt nicht gleich ganz überfordern, da muss man sich erst mal grundlegend mit der XSLT Beschreibungssprache beschäftigen
.
Alternativ könnte man mit Powershell auch gleich ein CSV-File aus dem XML machen wenn du das sowieso in Excel rein lädst.
Guckst du hier rein, das hatten wir gerade erst: XML in CSV umwandeln - Powershell
Powershell Grundlagen wie immer hier nachzulesen
Powershell - Leitfaden für Anfänger
Grüße Uwe
Lass das mit Batch sein, das ist für XML die schlechteste Wahl überhaupt, mach es beispielsweise mit Powershell
# ordner mit den XML Dateien
$folder = 'D:\XML-Files'
# Ausgabedatei
$filenew = 'D:\Ziel\merged.xml'
# --------------------------------------------
# ausgabe object
$merged = [xml]'<?xml version="1.0" encoding="utf-8"?><a></a>'
# für jedes XML file im Ordner
foreach($file in (Get-ChildItem $folder -File -Filter *.xml )){
# XML Datei in Object laden
$xml = new-Object XML;$xml.Load($file.Fullname)
# ROW Knoten eine Ebene höher verschieben
$xml.SelectNodes("//ROW") | %{[void]$_.ParentNode.ParentNode.InsertBefore($_,$_.ParentNode)}
# ROWDATA Knoten entfernen
$xml.SelectNodes("//TABLE/ROWDATA") | %{[void]$_.ParentNode.RemoveChild($_)}
# TABLE knoten an NE Knoten anhängen
$xml.SelectNodes("//TABLE") | %{[void]$xml.a.NE.AppendChild($_)}
# NE Knoten in neuem Dokument anhängen
[void]$merged.DocumentElement.AppendChild($merged.ImportNode($xml.a.NE,$true))
}
# neues Dokument speichern
$merged.Save($filenew)
Ich würde sowas zwar gleich mit XSLT machen aber ich wollte dich damit jetzt nicht gleich ganz überfordern, da muss man sich erst mal grundlegend mit der XSLT Beschreibungssprache beschäftigen
Alternativ könnte man mit Powershell auch gleich ein CSV-File aus dem XML machen wenn du das sowieso in Excel rein lädst.
Guckst du hier rein, das hatten wir gerade erst: XML in CSV umwandeln - Powershell
Powershell Grundlagen wie immer hier nachzulesen
Powershell - Leitfaden für Anfänger
Grüße Uwe
Wenn es Tags mit neuen Namen sind musst du diese natürlich hinzufügen, kommt halt drauf an wo und wie was neu hizukommt, das kann ich hier nicht hellsehen
.
Hallo Zusammen,
Ich habe ein ähnliches Problem und beübe mich schon seit ein paar Abenden mit diesem Thema, scheint aber mein Verständnis zu überschreiten. Ich versuche einen ähnlichen Befehl zu kreieren wie der obige.
Ich habe x Files die auf einmal so daherkommen und in ein Import File das alle 60 Sekunden importiert werden kann.
Ich würde dies gerne in ein einzelnes File verschieben und die Quellfiles löschen. Das File sollte so aussehen:
Kann hier jemand einem Laien einen Tipp geben?
Ich danke Euch
Marc
Ich habe ein ähnliches Problem und beübe mich schon seit ein paar Abenden mit diesem Thema, scheint aber mein Verständnis zu überschreiten. Ich versuche einen ähnlichen Befehl zu kreieren wie der obige.
Ich habe x Files die auf einmal so daherkommen und in ein Import File das alle 60 Sekunden importiert werden kann.
<?xml version="1.0" encoding="ISO-8859-1"?>
<winkeynet>
<Person No="12345" Name="Muster" FirstName="Max" Mail="maxmuster@email.ch" Del="0">
<Card No="54321" Enabled="1">
<Rights>
<Depotplan ID="91"/>
<Depotplan ID="73"/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
</Rights>
</Card>
</Person>
</winkeynet>
Ich würde dies gerne in ein einzelnes File verschieben und die Quellfiles löschen. Das File sollte so aussehen:
<?xml version="1.0" encoding="ISO-8859-1"?>
<winkeynet>
<Person No="98765" Name="Anders" FirstName="Maxi" Mail="maxianders@email.ch" Del="0">
<Card No="56789" Enabled="1">
<Rights>
<Depotplan ID="32"/>
<Depotplan ID="16"/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
</Rights>
</Card>
</Person>
<Person No="12345" Name="Muster" FirstName="Max" Mail="maxmuster@email.ch" Del="0">
<Card No="54321" Enabled="1">
<Rights>
<Depotplan ID="91"/>
<Depotplan ID="73"/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
<Depotplan ID=""/>
</Rights>
</Card>
</Person>
</winkeynet>
Kann hier jemand einem Laien einen Tipp geben?
Ich danke Euch
Marc
Servus Marc, willkommen auf Administrator.de!
Eigentlich sehen wir hier das Übernehmen von fremden Threads nicht so gerne aber da du hier neu bist machen wir ausnahmsweise mal eine Ausnahme.
Demo
https://tio.run/##7VNdT9swFH1ufsWV6dR2WlLKhwZawocoTJWgoLGHSQhNJr5tDI4dOU ...
Grüße Uwe
Eigentlich sehen wir hier das Übernehmen von fremden Threads nicht so gerne aber da du hier neu bist machen wir ausnahmsweise mal eine Ausnahme.
# ordner mit den XML Dateien
$folder = 'd:\source'
# Ausgabedatei
$filenew = 'd:\merged.xml'
# --------------------------------------------
# wenn die Ausgabedatei bereits existiert lade den vorhandenen Inhalt, ansonsten erstelle eine leere Datei
if (Test-Path $filenew){
$merged = New-Object XML
$merged.Load($filenew)
}else{
$merged = [xml]'<?xml version="1.0" encoding="ISO-8859-1"?><winkeynet/>'
}
# für jedes XML file im Ordner
foreach($file in (Get-ChildItem $folder -File -Filter *.xml )){
# XML Datei in Object laden
$xml = new-Object XML;$xml.Load($file.Fullname)
# importiere jedes 'person' element in die neue Datei
$xml.winkeynet.person | %{[void]$merged.DocumentElement.AppendChild($merged.ImportNode($_,$true))}
# entferne die XML Datei
remove-item $file.Fullname -Force
}
# neues Dokument speichern
$merged.Save($filenew)
https://tio.run/##7VNdT9swFH1ufsWV6dR2WlLKhwZawocoTJWgoLGHSQhNJr5tDI4dOU ...
Grüße Uwe