XML Datei per Skript ändern
Hallo zusammen,
ich habe eine Frage zur automatischen Konvertierung einer XML Datei.
Und zwar:
Wir bekommen aus unserem Warenwirtschaftssystem folgende XML Datei raus:
Das Problem ist, dass wir für den Import in ein anderes Programm ein anderes Format benötigen:
Am Beispiel hier der Preis und Artikel.
Leider ist es nicht möglich dies direkt aus dem Warenwirtschaftssystem zu ändern.
Gibt es eine Möglichkeit diese Änderungen per Skript durchzuführen? Bzw. gibt es für so etwas ein Programm?
Das heißt: Automatisch (zum Beispiel) alle 5 Std. die XML Datei aus einem bestimmten Ordner holen, bearbeiten und wieder in einen bestimmten Ordner speichern.
Würde mich riesig über Antworten freuen!
Grüße,
chrisen
ich habe eine Frage zur automatischen Konvertierung einer XML Datei.
Und zwar:
Wir bekommen aus unserem Warenwirtschaftssystem folgende XML Datei raus:
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<article>
<ordernumber>100002</ordernumber>
<mainnumber>100002</mainnumber>
<name>Artikelname</name>
<tax>19.00</tax>
<suppliername>Hersteller</suppliername>
<Price>0.000000</Price>
</article>
<article>
<ordernumber>100005</ordernumber>
<mainnumber>100005</mainnumber>
<name>Artikelname</name>
<tax>19.00</tax>
<suppliername>Hersteller</suppliername>
<Price>0.000000</Price>
</article>
</DocumentElement>
Das Problem ist, dass wir für den Import in ein anderes Programm ein anderes Format benötigen:
Am Beispiel hier der Preis und Artikel.
Leider ist es nicht möglich dies direkt aus dem Warenwirtschaftssystem zu ändern.
<Root>
<articles>
<article>
<orderNumber> 100005 </orderNumber>
<mainNumber> 100005 </mainNumber>
<name>Münsterländer Aperitif 16%</name>
<supplierName>Feinbrennerei Sasse</supplierName>
<tax>19.00</tax>
<price>
<price>14.95</price>
</price>
</article>
</articles>
</Root>
Gibt es eine Möglichkeit diese Änderungen per Skript durchzuführen? Bzw. gibt es für so etwas ein Programm?
Das heißt: Automatisch (zum Beispiel) alle 5 Std. die XML Datei aus einem bestimmten Ordner holen, bearbeiten und wieder in einen bestimmten Ordner speichern.
Würde mich riesig über Antworten freuen!
Grüße,
chrisen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 313935
Url: https://administrator.de/contentid/313935
Ausgedruckt am: 04.12.2024 um 19:12 Uhr
12 Kommentare
Neuester Kommentar
Hallo chrisen,
das ist kein Problem. Wie @129813 schreibt ist für sowas XSLT normalerweise das Mittel der Wahl, geht zwar auch per Skript aber schneller ist's mit XSLT.
Dazu erstellt du eine Datei mit folgendem Inhalt und gibst Ihr den Namen transform.xslt
ACHTUNG: XSLT und XML ist casesensitive !!
Dann erstellst du dir ein Powershell-Skript mit folgendem Inhalt, die Pfade musst du natürlich anpassen.
Skript ausführen, fertig.
XSL Transformation kann man fast mit jeder beliebigen Skriptsprache umsetzen. Das war jetzt ein Powershell Beispiel.
Hier als Ergänzung noch die VBS/VBA Variante für das XSL Stylesheet von oben, für diejenigen für die Powershell noch immer ein böhmisches Dorf sein sollte
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
das ist kein Problem. Wie @129813 schreibt ist für sowas XSLT normalerweise das Mittel der Wahl, geht zwar auch per Skript aber schneller ist's mit XSLT.
Dazu erstellt du eine Datei mit folgendem Inhalt und gibst Ihr den Namen transform.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<root>
<articles>
<xsl:for-each select="DocumentElement/article">
<article>
<orderNumber><xsl:value-of select="ordernumber"/></orderNumber>
<mainNumber><xsl:value-of select="mainnumber"/></mainNumber>
<name><xsl:value-of select="name"/></name>
<supplierName><xsl:value-of select="suppliername"/></supplierName>
<tax><xsl:value-of select="tax"/></tax>
<price>
<price><xsl:value-of select="Price"/></price>
</price>
</article>
</xsl:for-each>
</articles>
</root>
</xsl:template>
</xsl:stylesheet>
Dann erstellst du dir ein Powershell-Skript mit folgendem Inhalt, die Pfade musst du natürlich anpassen.
function Transform-XML{
param([string]$xsltfile,[string]$xmlfile,[string]$xmlfileout
)
try{
$xslt = New-Object system.xml.xsl.xslcompiledtransform
$xslt.Load($xsltfile)
$xslt.Transform($xmlfile,$xmlfileout)
}catch{
throw $_.Exception.Message
}
}
Transform-XML -xsltfile 'C:\transform.xslt' -xmlfile 'C:\input.xml' -xmlfileout 'A:\output.xml'
XSL Transformation kann man fast mit jeder beliebigen Skriptsprache umsetzen. Das war jetzt ein Powershell Beispiel.
Hier als Ergänzung noch die VBS/VBA Variante für das XSL Stylesheet von oben, für diejenigen für die Powershell noch immer ein böhmisches Dorf sein sollte
Const XMLIN = "C:\input.xml"
Const XMLOUT = "C:\output.xml"
Const XSLT = "C:\transform.xslt"
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")
Set xsltDoc = CreateObject("Msxml2.DOMDocument.6.0")
xsltDoc.async = False : xmlDoc.async = False
xmlDoc.load(XMLIN) : xsltDoc.load(XSLT)
xmlDoc.transformNodeToObject xsltDoc,xmlDoc
xmlDoc.save XMLOUT
msgbox "XML Datei wurde transformiert und liegt unter: " & XMLOUT, vbInformation
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Hast du auf Groß-Kleinschreibung im XSL-Stylesheet geachtet? Die XPath-Selectoren wie in folgender Zeile sind case sensitive, d.h. diese müssen exakt mit der Quelle übereinstimmen sonst bekommst du so solch eine Ausgabe wie bei dir
Ich habe mich exakt an dein obiges Quelldokument gehalten, und damit funktioniert das hier einwandfrei. Du wirst dort einfach einen kleinen Typo gemacht haben oder dein Quelldokument ist nicht gleich formatiert wie du es hier gepostet hast. Eventuell hast du aber auch das XSLT nicht im UTF8 Format gespeichert.
Grüße Uwe
<xsl:for-each select="DocumentElement/article">
Grüße Uwe
Kann ich nicht bestätigen, läuft fehlerfrei:
Ergebnis des Transforms:
Auf welchem OS und mit welcher PS Version machst du das ganze ?
Wurde hier auf Windows 7/10 mit PS4/5 problemlos getestet.
Ergebnis des Transforms:
<?xml version="1.0" encoding="utf-8"?>
<root>
<articles>
<article>
<orderNumber>100002</orderNumber>
<mainNumber>100002</mainNumber>
<name>Artikelname</name>
<supplierName>Hersteller</supplierName>
<tax>19.00</tax>
<price>
<price>0.000000</price>
</price>
</article>
<article>
<orderNumber>100005</orderNumber>
<mainNumber>100005</mainNumber>
<name>Artikelname</name>
<supplierName>Hersteller</supplierName>
<tax>19.00</tax>
<price>
<price>0.000000</price>
</price>
</article>
</articles>
</root>
Wurde hier auf Windows 7/10 mit PS4/5 problemlos getestet.
Hier funktionieren beide Versionen sowohl VBS als auch das PS in PS 2.0 Umgebung.
Ich tippe auf ein Encoding-Problem auf deiner Seite. Und überprüfe deine Skripte bitte nochmal, ich hatte sie nach dem Posten nachträglich oben noch etwas optimiert, vielleicht hattest du einfach eine falsche Version kopiert.
Ich tippe auf ein Encoding-Problem auf deiner Seite. Und überprüfe deine Skripte bitte nochmal, ich hatte sie nach dem Posten nachträglich oben noch etwas optimiert, vielleicht hattest du einfach eine falsche Version kopiert.
I did a test and here it works too, both the VBS and PS4.0.
Regards
Regards