krustenkaese

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:
<?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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

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

colinardo
Lösung colinardo 24.01.2022 aktualisiert um 14:23:25 Uhr
Goto Top
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
# 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 face-wink.

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
Krustenkaese
Krustenkaese 24.01.2022 um 14:17:57 Uhr
Goto Top
Hi Uwe, ich habe dein PS-Code ausgeführt und vorher die oberen 2 Pfade geändert. Den Dateinamen "merged.xml" habe ich gelassen. Die Datei enthält nur folgendes:
<?xml version="1.0" encoding="UTF-8"?>  
<a></a>
Habe ich noch was vergessen?
colinardo
colinardo 24.01.2022 aktualisiert um 14:38:42 Uhr
Goto Top
Dann hast du uns wohl verschwiegen was die XML sonst noch so enthält. Enthalten sie Namespaces?
Habe mit deinen hier gelisteten Beispielen einwandfrei getestet.

screenshot

screenshot
Krustenkaese
Krustenkaese 24.01.2022 um 14:45:38 Uhr
Goto Top
Ja, ich habe die Daten zum teilen teilweise geändert. Funktioniert bei mir jetzt einwandfrei mit den gegebenen Dateien.
Vielen Dank für deine schnell Hilfe face-smile
Wie ist das wenn die xml Dateien mehr/andere Zeilen dazu kommen?
Krustenkaese
Krustenkaese 24.01.2022 um 14:52:59 Uhr
Goto Top
Kann die Frage schon selber beantworten: JA
Damit schließe ich den Thread.
Danke Uwe
colinardo
colinardo 24.01.2022 aktualisiert um 14:54:33 Uhr
Goto Top
Zitat von @Krustenkaese:
Wie ist das wenn die xml Dateien mehr/andere Zeilen dazu kommen?
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 face-smile.
WyssyW
WyssyW 09.06.2022 um 19:25:59 Uhr
Goto Top
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.

<?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
colinardo
colinardo 09.06.2022 aktualisiert um 22:51:27 Uhr
Goto Top
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.
# 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)
Demo
https://tio.run/##7VNdT9swFH1ufsWV6dR2WlLKhwZawocoTJWgoLGHSQhNJr5tDI4dOU ...

Grüße Uwe
WyssyW
WyssyW 10.06.2022 um 00:42:39 Uhr
Goto Top
Moin Uwe

Besten Dank für die Ausnahme, die Beschreibung ist super, so kann ich in den Anleitungen die Funktionsweisen nachschlagen. Ich möchte verstehen wie das funktioniert, um sowas auch selber hinzukriegen.

Grüsse aus der Schweiz
Marc