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, 1359 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
Administrator.de Feedback
Entwicklertagebuch: Die nächste Version
Information von admtech vor 16 StundenAdministrator.de Feedback4 Kommentare

Hallo Administrator User, vielleicht haben es einige User schon mitbekommen: Wir arbeiten aktuell an einer komplett neuen Version von ...

Windows Server

Active Directory ESE Version Store Changes in Server 2019

Information von Dani vor 4 TagenWindows Server

Moin, Last month at Microsoft Ignite, many exciting new features rolling out in Server 2019 were talked about. But ...

Exchange Server

Microsoft Extending End of Support for Exchange Server 2010

Information von Dani vor 4 TagenExchange Server4 Kommentare

Moin, After investigating and analyzing the deployment state of an extensive number of Exchange customers we have decided to ...

Schulung & Training

Humble Book Bundle: Network and Security Certification 2.0

Tipp von NetzwerkDude vor 4 TagenSchulung & Training

Abend, bei HumbleBundle gibts mal wider ein schönes Paket e-books: sind verschiedene Zertifizierungen wie MCSA, CCNA, CompTIA etc., für ...

Heiß diskutierte Inhalte
Visual Studio
Prüfen, ob Programm schon disposed wurde
Frage von MarcoBornVisual Studio17 Kommentare

Hallo Forum, ich habe in VB.NET ein Programm geschrieben, welches Word startet und dort Daten ausliest. Obwohl ich die ...

DNS
DNS Probleme nach Umstellung auf IPv6
Frage von thunderbird304DNS16 Kommentare

Hi Leute! Folgende Problematik: Umstieg von Glasfaser auf Telekom Buisiness DSL. Durch die Umstellung ist die FritzBox nun Gateway. ...

Netzwerkgrundlagen
Zukunftsicheres Heimnetzwerk aufbauen
Frage von CRO-WarriorNetzwerkgrundlagen16 Kommentare

Hallo Leute. Ich bin dabei das Haus in Kroatien zu renovieren. Da hab ich jetzt die Möglichkeit alles so ...

Windows 10
Computer stürzt beim öffnen einer Software mit einem bestimmten Domänen User ab
Frage von PhilipSysWindows 1013 Kommentare

Hallo Zusammen, ich habe momentan mit einem recht harten Problem zu kämpfen! Ein User bei uns hat das Problem ...