Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst XML Datei per Skript ändern

Mitglied: chrisen

chrisen (Level 1) - Jetzt verbinden

30.08.2016, aktualisiert 10:25 Uhr, 1396 Aufrufe, 12 Kommentare, 4 Danke

Hallo zusammen,
ich habe eine Frage zur automatischen Konvertierung einer XML Datei.

Und zwar:
Wir bekommen aus unserem Warenwirtschaftssystem folgende XML Datei raus:


01.
<?xml version="1.0" standalone="yes"?>
02.
<DocumentElement>
03.
  <article>
04.
    <ordernumber>100002</ordernumber>
05.
    <mainnumber>100002</mainnumber>
06.
    <name>Artikelname</name>
07.
    <tax>19.00</tax>
08.
    <suppliername>Hersteller</suppliername>
09.
    <Price>0.000000</Price>
10.
  </article>
11.
  <article>
12.
    <ordernumber>100005</ordernumber>
13.
    <mainnumber>100005</mainnumber>
14.
    <name>Artikelname</name>
15.
    <tax>19.00</tax>
16.
    <suppliername>Hersteller</suppliername>
17.
    <Price>0.000000</Price>
18.
  </article>
19.
</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.

01.

02.
<Root>
03.
   <articles>
04.
     <article>
05.
	  <orderNumber> 100005 </orderNumber>
06.
	  <mainNumber> 100005 </mainNumber>
07.
	  <name>Münsterländer Aperitif 16%</name>
08.
	  <supplierName>Feinbrennerei Sasse</supplierName>
09.
	  <tax>19.00</tax>
10.
	  <price>
11.
		  <price>14.95</price>
12.
	  </price>
13.
      </article>
14.
   </articles>
15.
</Root>
16.
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
Mitglied: 129813
LÖSUNG 30.08.2016 um 10:30 Uhr
Hi
you only need to transfrom it with XSLT
http://www.w3schools.com/xsl/xsl_intro.asp

Regards
Bitte warten ..
Mitglied: colinardo
LÖSUNG 30.08.2016, aktualisiert um 12:21 Uhr
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
01.
<?xml version="1.0" encoding="UTF-8"?>
02.
<xsl:stylesheet version="1.0"
03.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
04.
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
05.
<xsl:template match="/">
06.
  <root>
07.
  <articles>
08.
    <xsl:for-each select="DocumentElement/article">
09.
      <article>
10.
	  <orderNumber><xsl:value-of select="ordernumber"/></orderNumber>
11.
	  <mainNumber><xsl:value-of select="mainnumber"/></mainNumber>
12.
	  <name><xsl:value-of select="name"/></name>
13.
	  <supplierName><xsl:value-of select="suppliername"/></supplierName>
14.
	  <tax><xsl:value-of select="tax"/></tax>
15.
	  <price>
16.
		<price><xsl:value-of select="Price"/></price>
17.
	  </price>
18.
      </article>
19.
    </xsl:for-each>
20.
    </articles>
21.
  </root>
22.
</xsl:template>
23.
</xsl:stylesheet>
ACHTUNG: XSLT und XML ist casesensitive !!

Dann erstellst du dir ein Powershell-Skript mit folgendem Inhalt, die Pfade musst du natürlich anpassen.
01.
function Transform-XML{
02.
    param([string]$xsltfile,[string]$xmlfile,[string]$xmlfileout
03.
    )
04.
try{
05.
        $xslt = New-Object system.xml.xsl.xslcompiledtransform
06.
        $xslt.Load($xsltfile)
07.
        $xslt.Transform($xmlfile,$xmlfileout)
08.
    }catch{
09.
        throw $_.Exception.Message
10.
   }
11.
}
12.
Transform-XML -xsltfile 'C:\transform.xslt' -xmlfile 'C:\input.xml' -xmlfileout 'A:\output.xml'
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
01.
Const XMLIN = "C:\input.xml"
02.
Const XMLOUT = "C:\output.xml"
03.
Const XSLT = "C:\transform.xslt"
04.
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")
05.
Set xsltDoc = CreateObject("Msxml2.DOMDocument.6.0")
06.
xsltDoc.async = False : xmlDoc.async = False
07.
xmlDoc.load(XMLIN) : xsltDoc.load(XSLT)
08.
xmlDoc.transformNodeToObject xsltDoc,xmlDoc
09.
xmlDoc.save XMLOUT
10.
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
Bitte warten ..
Mitglied: chrisen
30.08.2016 um 11:37 Uhr
Super vielen vielen Dank!!

Es ist echt einfacher als ich gedacht hätte.

Grüße,
chrisen
Bitte warten ..
Mitglied: colinardo
30.08.2016, aktualisiert um 12:21 Uhr
Keine Ursache. Schöne Woche.

Grüße Uwe
Bitte warten ..
Mitglied: chrisen
30.08.2016 um 14:03 Uhr
Hallo collinardo,
ich habe leider noch ein kleines Problem/Frage, wenn ich das Skript ausführe:
Ich bekomme als Output Datei immer eine Datei heraus die wie folgt aussieht:

01.
<?xml version="1.0" encoding="UTF-8"?>
02.
<root>
03.
	<articles></articles>
04.
</root>
Bitte warten ..
Mitglied: colinardo
30.08.2016, aktualisiert um 14:09 Uhr
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
<xsl:for-each select="DocumentElement/article"> 
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
Bitte warten ..
Mitglied: chrisen
30.08.2016 um 14:15 Uhr
Ja ich habe mich exakt an die Groß- und Kleinschreibung gehalten.

Meine Input Datei sieht zum Test so aus:

01.
<?xml version="1.0" encoding="UTF-8"?>
02.
<DocumentElement>
03.
  <article>
04.
    <ordernumber>100002</ordernumber>
05.
    <mainnumber>100002</mainnumber>
06.
    <name>Artikelname</name>
07.
    <tax>19.00</tax>
08.
    <suppliername>Hersteller</suppliername>
09.
    <Price>0.000000</Price>
10.
  </article>
11.
  <article>
12.
    <ordernumber>100005</ordernumber>
13.
    <mainnumber>100005</mainnumber>
14.
    <name>Artikelname</name>
15.
    <tax>19.00</tax>
16.
    <suppliername>Hersteller</suppliername>
17.
    <Price>0.000000</Price>
18.
  </article>
19.
</DocumentElement>
die XSL so:

01.
<?xml version="1.0" encoding="UTF-8"?>
02.
<xsl:stylesheet version="1.0"
03.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
04.
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
05.
<xsl:template match="/">
06.
  <root>
07.
  <articles>
08.
    <xsl:for-each select="DocumentElement/article">
09.
      <article>
10.
	  <orderNumber><xsl:value-of select="ordernumber"/></orderNumber>
11.
	  <mainNumber><xsl:value-of select="mainnumber"/></mainNumber>
12.
	  <name><xsl:value-of select="name"/></name>
13.
	  <supplierName><xsl:value-of select="suppliername"/></supplierName>
14.
	  <tax><xsl:value-of select="tax"/></tax>
15.
	  <price>
16.
		<price><xsl:value-of select="Price"/></price>
17.
	  </price>
18.
      </article>
19.
    </xsl:for-each>
20.
    </articles>
21.
  </root>
22.
</xsl:template>
23.
</xsl:stylesheet>
24.
Bitte warten ..
Mitglied: colinardo
30.08.2016, aktualisiert um 14:23 Uhr
Kann ich nicht bestätigen, läuft fehlerfrei:
Ergebnis des Transforms:
01.
<?xml version="1.0" encoding="utf-8"?>
02.
<root>
03.
  <articles>
04.
    <article>
05.
      <orderNumber>100002</orderNumber>
06.
      <mainNumber>100002</mainNumber>
07.
      <name>Artikelname</name>
08.
      <supplierName>Hersteller</supplierName>
09.
      <tax>19.00</tax>
10.
      <price>
11.
        <price>0.000000</price>
12.
      </price>
13.
    </article>
14.
    <article>
15.
      <orderNumber>100005</orderNumber>
16.
      <mainNumber>100005</mainNumber>
17.
      <name>Artikelname</name>
18.
      <supplierName>Hersteller</supplierName>
19.
      <tax>19.00</tax>
20.
      <price>
21.
        <price>0.000000</price>
22.
      </price>
23.
    </article>
24.
  </articles>
25.
</root>
Auf welchem OS und mit welcher PS Version machst du das ganze ?

Wurde hier auf Windows 7/10 mit PS4/5 problemlos getestet.
Bitte warten ..
Mitglied: chrisen
30.08.2016, aktualisiert um 14:29 Uhr
Ich mache das mit Windows 7 und mit der PS Version 2.0. Habe es zunächst zum testen mit einem VBScript (wie netterweise oben von dir beschrieben) gemacht
Bitte warten ..
Mitglied: colinardo
30.08.2016, aktualisiert um 14:35 Uhr
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.
Bitte warten ..
Mitglied: 129813
30.08.2016, aktualisiert um 14:38 Uhr
I did a test and here it works too, both the VBS and PS4.0.

Regards
Bitte warten ..
Mitglied: chrisen
30.08.2016 um 14:43 Uhr
Oh man. Ich hatte einen ganz kleinen Fehler im Skript in der Namensgebung beim Input...

Vielen Dank nochmal für deine Hilfe!!!
Bitte warten ..
Ähnliche Inhalte
XML
XML Datei Fehler?
Frage von Patrick-ITXML1 Kommentar

Hallo zusammen ich benutze Sysprep, um ein Image von einer Maschine zu machen und lade dieses dann auf einem ...

XML
XML Datei mit Powershell splitten
gelöst Frage von LianenSchwingerXML2 Kommentare

Hallo, ich habe eine riesige Exportdatei im XML-Format die ich nicht weiterverarbeiten kann. Der Aufbau ist wie folgt: Ich ...

VB for Applications
XML Datei auslesen mit Excel
Frage von kaiuwe28VB for Applications10 Kommentare

Hallo zusammen, ich mal wieder Leider komme ich nicht weiter. Ich möchte aus einem Ordner mit mehreren XML Dateien ...

XML
Vbs - simple XML Datei auslesen
gelöst Frage von DeeJayBeeXML4 Kommentare

Hallo zusammen, ich glaub, ich hab grad ne kleine Blockade oder denke viel zu kompliziert. Gegeben ist eine xml-Datei ...

Neue Wissensbeiträge
Erkennung und -Abwehr
Emotet mit Rspamd und Oletools bekämpfen
Tipp von Dani vor 12 StundenErkennung und -Abwehr1 Kommentar

Moin, Um oletools während der Annahme einer E-Mail die bereits angehängten Office-Dateien analysieren lassen zu können, haben wir für ...

Viren und Trojaner

Gratis-Entschlüsselungstool für STOP-Ransomware verfügbar

Information von AnkhMorpork vor 19 StundenViren und Trojaner

Der Sicherheitsanbieter Emisoft hat ein kostenloses Tool veröffentlicht, mit dem sich Dateien entschlüsseln lassen, die die Ransomware STOP unbrauchbar ...

Off Topic
8 zoll disketten
Information von brammer vor 1 TagOff Topic5 Kommentare

Hallo, ob das so gut ist brammer

Off Topic
Noch mehr was ich nicht brauche
Information von brammer vor 4 TagenOff Topic6 Kommentare

Hallo, WOFÜR? WARUM? brammer

Heiß diskutierte Inhalte
Windows 7
Alter PC abgebrannt - Festplatte im neuen PC führt zum Bluescreen
gelöst Frage von CAT404Windows 725 Kommentare

Moin ich habe seit heute mittag einen PC aufm Tisch stehen, total verzweifelter Eigentümer. Der Rechner ist so ein ...

Server-Hardware
Welches Betriebssystem für DL380p Gen8 für den Heimgebrauch
Frage von peter91gServer-Hardware17 Kommentare

Hallo zusammen, betreibe Zuhause einen Dl380p G8 derzeit mit ESXI in der Testversion. Es läuft je nach Bedarf Ubuntu ...

Windows Server
Powershell Skript kann nicht geladen werden
Frage von renatus85Windows Server14 Kommentare

Hallo, ich habe folgendes Anliegen: In unserer Organisation setzen wir AlwaysOn VPN ein. Das funktioniert soweit auch ohne Probleme. ...

Router & Routing
ARCHER C7 als Open VPN-Server im Netwerk einer Fritzbox 6490
Frage von thburkhartRouter & Routing14 Kommentare

Guten Tag, ich habe bei UnityMedia eine Fritzbox 6490, die die Verbindung zur WAN-Seite herstellt. Einen VPN-Zugriff realisiere über ...