Wert in mehreren XML Dateien per Script ersetzen
Hallo zusammen,
habe an meinem Logistik-Arbeitsplatz folgendes Problem:
Wir bekommen täglich massig elektronische Lieferscheine als XML Dateien. Darin müsste die falsche ILN im Bereich ShipToParty (Zeile 32) ersetzt werden (Die ILNs bei Vendor [Zeile 20] und OrderingParty [Zeile 26] sollen unangetastet bleiben).
Die zu ändernde ILN hat aktuell immer entweder den Wert A oder den Wert B. Nun soll sie durch die korrekten ILNs C und D ersetzt werden (C ersetzt immer A; D ersetzt immer B).
Hättet Ihr mir da ein kleines VBS parat so a la "wenn ILN = A dann ersetzte durch Fixwert C; wenn ILN = B dann ersetzte durch Fixwert D" ?
Dann lass ich das über den entsprechenden Ordner laufen und muss nicht mehr von Hand in Dutzenden XMLs rumpasten.
Besonders nervig: du hast im Clipboard die eine ILN, musst aber ständig wechseln, weil du nicht siehst welche ILN dich in der Datei erwartet. Ja, lacht nicht, so steinzeitmäßig geht das hier
Ich habe diesen Thread schon durchgelesen Inhalt einer XML Datei per Batch bzw. Script ändern aber das passt nicht so recht auf meinen Fall.
btw: natürlich wäre es einfacher, wenn unsere Lieferanten die korrekten ILNs in ihren Stammdaten ändern würden, aber das ist nicht in Sicht.
Wäre echt nett wenn Ihr mir helfen könntet.
Grüße
PJ
So sieht der relevante teil der XML Datei aus.
habe an meinem Logistik-Arbeitsplatz folgendes Problem:
Wir bekommen täglich massig elektronische Lieferscheine als XML Dateien. Darin müsste die falsche ILN im Bereich ShipToParty (Zeile 32) ersetzt werden (Die ILNs bei Vendor [Zeile 20] und OrderingParty [Zeile 26] sollen unangetastet bleiben).
Die zu ändernde ILN hat aktuell immer entweder den Wert A oder den Wert B. Nun soll sie durch die korrekten ILNs C und D ersetzt werden (C ersetzt immer A; D ersetzt immer B).
Hättet Ihr mir da ein kleines VBS parat so a la "wenn ILN = A dann ersetzte durch Fixwert C; wenn ILN = B dann ersetzte durch Fixwert D" ?
Dann lass ich das über den entsprechenden Ordner laufen und muss nicht mehr von Hand in Dutzenden XMLs rumpasten.
Besonders nervig: du hast im Clipboard die eine ILN, musst aber ständig wechseln, weil du nicht siehst welche ILN dich in der Datei erwartet. Ja, lacht nicht, so steinzeitmäßig geht das hier
Ich habe diesen Thread schon durchgelesen Inhalt einer XML Datei per Batch bzw. Script ändern aber das passt nicht so recht auf meinen Fall.
btw: natürlich wäre es einfacher, wenn unsere Lieferanten die korrekten ILNs in ihren Stammdaten ändern würden, aber das ist nicht in Sicht.
Wäre echt nett wenn Ihr mir helfen könntet.
Grüße
PJ
So sieht der relevante teil der XML Datei aus.
<?xml version="1.0" encoding="UTF-8"?>
<DeliveryNote>
<Type>DESADV</Type>
<MessageDate>bla</MessageDate>
<Test>0</Test>
<Header>
<DocumentID>1234</DocumentID>
<DocumentDate>bla</DocumentDate>
<DeliveryDate>bla</DeliveryDate>
<ShippingDate>bla</ShippingDate>
<Courier>maersk</Courier>
<Incoterms>
<Key>FH</Key>
<Description>Frei Haus; Liefertermin = ET</Description>
</Incoterms>
<TradingPartners>
<Vendor>
<Identifier>
<PartnerID>999</PartnerID>
<ILN>888</ILN>
</Identifier>
</Vendor>
<OrderingParty>
<Identifier>
<PartnerID>777</PartnerID>
<ILN>666</ILN>
</Identifier>
</OrderingParty>
<ShipToParty>
<Identifier>
<PartnerID>555</PartnerID>
<ILN>A</ILN>
</Identifier>
</Header>
</DeliveryNote>
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 263725
Url: https://administrator.de/forum/wert-in-mehreren-xml-dateien-per-script-ersetzen-263725.html
Ausgedruckt am: 13.05.2025 um 16:05 Uhr
5 Kommentare
Neuester Kommentar
Hallo PJ,
teste mal folgendes:
Die Zeilen 1-4 musst Du anpassen, hier werden die zu ersetzenden und die neuen Werte der ILNs eingetragen.
Um das Script aufzurufen, kannst Du es in das Verzeichnis mit den XML-Dateien kopieren und dort per Doppelklick oder über eine Verknüpfung starten. Du kannst auch das Icon des XML-Verzeichnisses mit der Maus auf das Icon des Scripts ziehen und fallen lassen.
Gruß
Friemler
teste mal folgendes:
strILN_A = "A"
strILN_B = "B"
strILN_C = "C"
strILN_D = "D"
If WScript.Arguments.Count > 0 Then
strFolder = WScript.Arguments(0)
Else
strFolder = "."
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objXmlDoc = CreateObject("Microsoft.XMLDOM")
objXmlDoc.async = False
objXmlDoc.validateOnParse = False
objXmlDoc.resolveExternals = False
If objFSO.FolderExists(strFolder) Then
For Each objFile In objFSO.GetFolder(strFolder).Files
If UCase(objFSO.GetExtensionName(objFile.Name)) = "XML" Then
strFile = objFile.Path
objXmlDoc.load(strFile)
If objXmlDoc.parseError.errorCode = 0 Then
Set objNode = objXmlDoc.documentElement.SelectSingleNode("//DeliveryNote/Header/TradingPartners/ShipToParty/Identifier/ILN")
If Not objNode Is Nothing Then
If objNode.Text = strILN_A Then
objNode.Text = strILN_C
ElseIf objNode.Text = strILN_B Then
objNode.Text = strILN_D
End If
objXmlDoc.save(strFile)
Else
WScript.Echo "Der Aufbau des XML-Dokuments" & vbNewLine & _
strFile & vbNewLine & _
"weicht vom Standard-Schema ab."
End If
Else
WScript.Echo "Das XML-Dokument" & vbNewLine & _
strFile & vbNewLine & _
"ist fehlerhaft."
End If
End If
Next
Else
WScript.Echo "Das angegebene Verzeichnis existiert nicht"
End If
Die Zeilen 1-4 musst Du anpassen, hier werden die zu ersetzenden und die neuen Werte der ILNs eingetragen.
Um das Script aufzurufen, kannst Du es in das Verzeichnis mit den XML-Dateien kopieren und dort per Doppelklick oder über eine Verknüpfung starten. Du kannst auch das Icon des XML-Verzeichnisses mit der Maus auf das Icon des Scripts ziehen und fallen lassen.
Gruß
Friemler
Hey,
zwischen Zeile 33 und 34 fehlt
Mit GNU sed sieht die Lösung so aus:
Wenn die zu suchende Zeichenkette Regex-Steuerzeichen
Gruß, Endoro
zwischen Zeile 33 und 34 fehlt
</ShipToParty>
in deinem Beispiel.Mit GNU sed sieht die Lösung so aus:
sed -ir "/<ShipToParty>/{:b;n;/<ILN>/{s/A/C/;t;s/B/D/;t};s#</ShipToParty>#&#;t;bb}" *.xml
.*/\
enthält, müssen die mit Backslash escaped werden.Gruß, Endoro

Oder als Powershell-Script so:
(Zeile 1 die zugehörigen Werte eintragen und in Zeile 2 den Pfad zu den XML-Dateien ändern)
Gruß jodel32
(Zeile 1 die zugehörigen Werte eintragen und in Zeile 2 den Pfad zu den XML-Dateien ändern)
$werte = @{'A'='555';'B'='666'}
$files = gci "c:\Ordner\*.xml"
$files | %{
$xml = [xml](gc $_.Fullname)
$werte.GetEnumerator() | %{
$iln = $xml.DeliveryNote.Header.TradingPartners.ShipToParty.Identifier.ILN
if ($iln -eq $_.Name){
$xml.DeliveryNote.Header.TradingPartners.ShipToParty.Identifier.ILN = $_.Value
}
}
$xml.Save($_.Fullname)
}