XML Parameter auslesen und in CSV überführen
Hallo zusammen,
Ich habe folgendes Problem:
Ich habe eine XML Datei im Internet auf die komme ich über http://........de/file.xml heran.und - Ja ich darf das, ja es ist meine Datei (kann natürlich aber auch ein lokaler Pfad sein wobei wenn ich sie übers Internet aufrufe aktueller ist)
Den für mich interessanten Aufbau der Datei lautet wie folgt (da steht aber nicht nur das, sondern noch anderes Zeugs drin)
WIe ihr sehen könnt geht es um Filme, dieser Block wiederholt sich pro Vorstellung.
Ich möchte folgende Werte pro Zeile in eine CSV oder in eine txt... (egal) übergeben: Für jeden Block dann quasi wieder eine neue Zeile....
In dieser Reihenfolge (wobei wenn das zusätzlich kompliziert ist, auch egal)
Ich bin hier schon auf den Beitrag gestoßen aber irgendwie will es nicht klappen:
XML nach bestimmten Feldern auslesen und in CSV exportieren
Danke, Grüße Crol1234
Ich habe folgendes Problem:
Ich habe eine XML Datei im Internet auf die komme ich über http://........de/file.xml heran.und - Ja ich darf das, ja es ist meine Datei (kann natürlich aber auch ein lokaler Pfad sein wobei wenn ich sie übers Internet aufrufe aktueller ist)
Den für mich interessanten Aufbau der Datei lautet wie folgt (da steht aber nicht nur das, sondern noch anderes Zeugs drin)
<PerformanceList>
.
.
.
.
<Performance FilmTitle="FILM" PerformanceTitle="Wert1" PerformanceOID="blablabla" FilmOID="blablabla" CenterOID="blablabla" PerformanceEDINumber="blablabla" PerformanceTyp="0" PerformanceDate="20120111" CinemaDay="blablabla" AuditoriumName="blablabla" AuditoriumNo="blablabla" AuditoriumOID="blablabla" WeekPlayed="blablabla" StartTime="2300" EndTime="0100" NominatedSeats="blablabla" Rating="12" NationwideStartDate="blablabla" TicketingLink="blablabla" FilmSeries="" SoundSystem="blablabla" PictureFormat="" SortOrderPrio="0" TimeStamp="5" CUSTOMFIELDSWEEKFILM="" CUSTOMFIELDSPERFORMANCE="" OCCUPATIONINFO="0"/>
.
.
.
.
</PerformanceList>
WIe ihr sehen könnt geht es um Filme, dieser Block wiederholt sich pro Vorstellung.
Ich möchte folgende Werte pro Zeile in eine CSV oder in eine txt... (egal) übergeben: Für jeden Block dann quasi wieder eine neue Zeile....
In dieser Reihenfolge (wobei wenn das zusätzlich kompliziert ist, auch egal)
PerformanceDate;StartTime;Endtime;PerformanceTitle;Rating (1. Block)
PerformanceDate;StartTime;Endtime;PerformanceTitle;Rating (2. Block)
PerformanceDate;StartTime;Endtime;PerformanceTitle;Rating usw...
usw...
Ich bin hier schon auf den Beitrag gestoßen aber irgendwie will es nicht klappen:
XML nach bestimmten Feldern auslesen und in CSV exportieren
Danke, Grüße Crol1234
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 178747
Url: https://administrator.de/contentid/178747
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo Crol1234,
das ist mit Batch eher suboptimal. VBS bietet über das XML DOM Object eine recht gute Alternative. Dazu müsstest du folgendes prüfen/mitteilen:
- ist die XML Datei in einem gültigen Format? (stimmt das im Kopf angegebene Encoding mit dem Inhalt überein, gibt es ungültige Zeichen im Text etc.)
- Wie sieht die Struktur der XML aus? (unter welchem Pfad finden sich die PerformanceList Elemente)
Grüße
rubberman
das ist mit Batch eher suboptimal. VBS bietet über das XML DOM Object eine recht gute Alternative. Dazu müsstest du folgendes prüfen/mitteilen:
- ist die XML Datei in einem gültigen Format? (stimmt das im Kopf angegebene Encoding mit dem Inhalt überein, gibt es ungültige Zeichen im Text etc.)
- Wie sieht die Struktur der XML aus? (unter welchem Pfad finden sich die PerformanceList Elemente)
Grüße
rubberman
Hallo Crol1234,
Umlaute und ß wären grundsätzlich für Encoding ISO-8859-1 in Ordnung. Bin noch auf Arbeit, werde mir das Ganze zu Hause zu Gemüte führen.
Ähnlich: #723768 Diese Geschichte. Da allerding als HTA mit Javascript.
Grüße
rubberman
Umlaute und ß wären grundsätzlich für Encoding ISO-8859-1 in Ordnung. Bin noch auf Arbeit, werde mir das Ganze zu Hause zu Gemüte führen.
Ähnlich: #723768 Diese Geschichte. Da allerding als HTA mit Javascript.
Grüße
rubberman
Hallo Crol1234.
Also "RentACoder.com" ist zwar eine andere Webseite, aber da ich es nun schon angeboten habe... Teste:
*.vbs
Grüße
rubberman
[...] mir geht es nur darum dass ich irgendwie was ausführbares brauch [...] wie das umgesetzt ist , ist eigentlich egal.
Also "RentACoder.com" ist zwar eine andere Webseite, aber da ich es nun schon angeboten habe... Teste:
*.vbs
Const sXMLURL = "http://www.forumoffenburg.de/texxas.xml"
Const sCSVPath = "test.csv"
Const sDelim = ";"
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", sXMLURL, False
oXMLHTTP.Send
If (oXMLHTTP.readyState = 4 And oXMLHTTP.status = 200) Then
Set oXmlDoc = CreateObject("MSXML2.DOMDocument")
oXmlDoc.async = False
oXmlDoc.validateOnParse = False
oXmlDoc.resolveExternals = False
Set oADOStream = CreateObject("ADODB.Stream")
With oADOStream
.Type = 1
.Mode = 3
.Open
.Write oXMLHTTP.responseBody
.Position = 0
.Type = 2
.CharSet = "ISO-8859-1"
oXmlDoc.loadXML .ReadText
.Close
End With
Set oADOStream = Nothing
End If
Set oXMLHTTP = Nothing
Set oPerfList = oXmlDoc.documentElement.selectSingleNode("//PerformanceList")
For Each oPerf In oPerfList.childNodes
txt = txt & oPerf.getAttribute("PerformanceDate") & sDelim & _
oPerf.getAttribute("StartTime") & sDelim & _
oPerf.getAttribute("EndTime") & sDelim & _
oPerf.getAttribute("PerformanceTitle") & sDelim & _
oPerf.getAttribute("Rating") & vbCrLf
Next
Set oPerfList = Nothing
Set oXmlDoc = Nothing
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile(sCSVPath, 2, True)
oFile.Write txt
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
MsgBox "CSV erstellt", vbInformation, "Fertig"
Grüße
rubberman
Hallo Crol1234.
Grüße
rubberman
funktioniert gut, kleinigkeit: PerformanceTitle wird abgeschnitten nach einer gewissen Anzahl an Buchstaben.
Schau mal in deine XML. Wolltest du lieber das Attribut FilmTitle?Kann man die Zeiten noch durch ein : trennen?
Kann man.Kann man eine Sortierung stattfinden lassen zuerst nach Datum und dann Nach Starttime?
Excel?Const sXMLURL = "http://www.forumoffenburg.de/texxas.xml"
Const sCSVPath = "test.csv"
Const sDelim = ";"
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", sXMLURL, False
oXMLHTTP.Send
If (oXMLHTTP.readyState = 4 And oXMLHTTP.status = 200) Then
Set oXmlDoc = CreateObject("MSXML2.DOMDocument")
oXmlDoc.async = False
oXmlDoc.validateOnParse = False
oXmlDoc.resolveExternals = False
Set oADOStream = CreateObject("ADODB.Stream")
With oADOStream
.Type = 1
.Mode = 3
.Open
.Write oXMLHTTP.responseBody
.Position = 0
.Type = 2
.CharSet = "ISO-8859-1"
oXmlDoc.loadXML .ReadText
.Close
End With
Set oADOStream = Nothing
End If
Set oXMLHTTP = Nothing
Set oPerfList = oXmlDoc.documentElement.selectSingleNode("//PerformanceList")
For Each oPerf In oPerfList.childNodes
txt = txt & oPerf.getAttribute("PerformanceDate") & sDelim & _
Left(oPerf.getAttribute("StartTime"), 2) & ":" & Right(oPerf.getAttribute("StartTime"), 2) & sDelim & _
Left(oPerf.getAttribute("EndTime"), 2) & ":" & Right(oPerf.getAttribute("EndTime"), 2) & sDelim & _
oPerf.getAttribute("FilmTitle") & sDelim & _
oPerf.getAttribute("Rating") & vbCrLf
Next
Set oPerfList = Nothing
Set oXmlDoc = Nothing
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile(sCSVPath, 2, True)
oFile.Write txt
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
MsgBox "CSV erstellt", vbInformation, "Fertig"
Grüße
rubberman
Hallo Crol1234,
mit Sortierung und entfernten Sternchen:
Grüße
rubberman
<EDIT: Bibers Anregung folgeleistend - Konstanten und Kommentare ergänzt. />
mit Sortierung und entfernten Sternchen:
Const sXMLURL = "http://www.forumoffenburg.de/texxas.xml"
Const sCSVPath = "test.csv"
Const sDelim = ";"
' Datentypen http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318%28v=vs.85%29.aspx
Const adInteger = 3 ' Ganzzahl
Const adChar = 129 ' String
' Streamtypen http://msdn.microsoft.com/en-us/library/windows/desktop/ms675277%28v=vs.85%29.aspx
Const adTypeBinary = 1
Const adTypeText = 2
' Streammodus http://msdn.microsoft.com/en-us/library/windows/desktop/ms675792%28v=vs.85%29.aspx
Const adModeReadWrite = 3
' Datei öffnen http://msdn.microsoft.com/en-us/library/314cz14s%28v=VS.85%29.aspx
Const ForWriting = 2
' IXMLHTTPRequest http://msdn.microsoft.com/en-us/library/windows/desktop/ms760305%28v=vs.85%29.aspx
' Download der Datei
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", sXMLURL, False
oXMLHTTP.Send
If (oXMLHTTP.readyState = 4 And oXMLHTTP.status = 200) Then
' XML DOM http://msdn.microsoft.com/en-us/library/windows/desktop/ms764730%28v=vs.85%29.aspx
' Verarbeitung von XML Daten
Set oXmlDoc = CreateObject("MSXML2.DOMDocument")
oXmlDoc.async = False
oXmlDoc.validateOnParse = False
oXmlDoc.resolveExternals = False
' ADO Stream http://msdn.microsoft.com/en-us/library/windows/desktop/ms675032%28v=vs.85%29.aspx
' Konvertierung zur korrekten Zeichenkodierung
Set oADOStream = CreateObject("ADODB.Stream")
With oADOStream
.Type = adTypeBinary
.Mode = adModeReadWrite
.Open
.Write oXMLHTTP.responseBody
.Position = 0
.Type = adTypeText
.CharSet = "ISO-8859-1"
oXmlDoc.loadXML .ReadText
.Close
End With
Set oADOStream = Nothing
End If
Set oXMLHTTP = Nothing
Set oPerfList = oXmlDoc.documentElement.selectSingleNode("//PerformanceList")
' ADO Recordset http://msdn.microsoft.com/en-us/library/windows/desktop/ms681510%28v=vs.85%29.aspx
' Virtuelle Datenbanktabelle zum Sortieren der Daten erstellen
Set oADORec = CreateObject("ADODB.Recordset")
oADORec.Fields.Append "Datum", adInteger
oADORec.Fields.Append "Startzeit", adChar, 5
oADORec.Fields.Append "Endzeit", adChar, 5
oADORec.Fields.Append "Saal", adInteger
oADORec.Fields.Append "Filmtitel", adChar, 1024
oADORec.Fields.Append "FSK", adInteger
oADORec.Open
arrFields = Array("Datum", "Startzeit", "Endzeit", "Saal", "Filmtitel", "FSK")
For Each oPerf In oPerfList.childNodes
sDatum = oPerf.getAttribute("PerformanceDate")
sStartzeit = Left(oPerf.getAttribute("StartTime"), 2) & ":" & Right(oPerf.getAttribute("StartTime"), 2)
sEndzeit = Left(oPerf.getAttribute("EndTime"), 2) & ":" & Right(oPerf.getAttribute("EndTime"), 2)
sSaal = oPerf.getAttribute("AuditoriumNo")
sFilmtitel = oPerf.getAttribute("FilmTitle")
If Left(sFilmtitel, 2) = "* " Then sFilmtitel = Mid(sFilmtitel, 3)
sFSK = oPerf.getAttribute("Rating")
arrValues = Array(sDatum, sStartzeit, sEndzeit, sSaal, sFilmtitel, sFSK)
oADORec.AddNew arrFields, arrValues
Next
Set oPerfList = Nothing
Set oXmlDoc = Nothing
oADORec.Sort = "Datum ASC, Startzeit ASC"
oADORec.MoveFirst
' Daten der CSV zusammenstellen
txt = "Datum" & sDelim & "Startzeit" & sDelim & "Endzeit" & sDelim & "Saal" & sDelim & "Filmtitel" & sDelim & "FSK" & vbCrLf
While Not oADORec.EOF
txt = txt & oADORec("Datum") & sDelim & _
oADORec("Startzeit") & sDelim & _
oADORec("Endzeit") & sDelim & _
oADORec("Saal") & sDelim & _
oADORec("Filmtitel") & sDelim & _
oADORec("FSK") & vbCrLf
oADORec.MoveNext
Wend
oADORec.Close
Set oADORec = Nothing
' FileSystemObject http://msdn.microsoft.com/en-us/library/d6dw7aeh%28v=VS.85%29.aspx
' Schreiben der Daten in die CSV Datei
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile(sCSVPath, ForWriting, True)
oFile.Write txt
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
MsgBox "CSV erstellt", vbInformation, "Fertig"
Grüße
rubberman
<EDIT: Bibers Anregung folgeleistend - Konstanten und Kommentare ergänzt. />
Moin rubberman,
einfach, pfiffig, nachvollziehbar und bei Bedarf auch von Nicht-Profis leicht anzupassen, deine Lösung.
Gefällt mir -sogar ohne Kommentarzeilen im Source sehr gut, und ich werde gleich einen entsprechenden Smiley setzen.
Könntest du mir und den sicherlich folgenden BeitragsfinderInnen noch - so quasi als kleinen Luxus - zwei Konstanten einbauen
<code type = plain>
...
Const adInteger = 3
Const adChar = 129
...und damit die Zeilen 33-38 etwas selbsterklärender machen?
So oder so ein danke von mir
Biber
einfach, pfiffig, nachvollziehbar und bei Bedarf auch von Nicht-Profis leicht anzupassen, deine Lösung.
Gefällt mir -sogar ohne Kommentarzeilen im Source sehr gut, und ich werde gleich einen entsprechenden Smiley setzen.
Könntest du mir und den sicherlich folgenden BeitragsfinderInnen noch - so quasi als kleinen Luxus - zwei Konstanten einbauen
<code type = plain>
...
Const adInteger = 3
Const adChar = 129
...und damit die Zeilen 33-38 etwas selbsterklärender machen?
So oder so ein danke von mir
Biber
Hallo Biber.
Oben entsprechend editiert ...
Grüße
rubberman
Gefällt mir -sogar ohne Kommentarzeilen im Source sehr gut, und ich werde gleich einen entsprechenden Smiley setzen.
Danke für die Blumen. Der Wink mit dem Zaunpfahl zwecks fehlender Kommentare ist angekommen Könntest du mir und den sicherlich folgenden BeitragsfinderInnen noch - so quasi als kleinen Luxus - zwei Konstanten einbauen
Warum nur zwei? Mir fallen noch mehr nicht selbsterklärende Werte auf.Oben entsprechend editiert ...
Grüße
rubberman
Moin Crol1234,
ich bin ja kein Fachmann beim Interpretieren von Redmonder Fehlermeldungen.
Aber für mich hört es sich danach an, als würde in deiner Import-Datei ein nicht vorgesehener Wert durchschlagen.
Hast du denn mal überprüft, ob vielleicht in der XML-Datei (in der, mit der es abgeraucht ist) in einem Feld "Geburtsdatum" vielleicht "Augsburg" drinsteht o.ä.?
Grüße
Biber
ich bin ja kein Fachmann beim Interpretieren von Redmonder Fehlermeldungen.
Aber für mich hört es sich danach an, als würde in deiner Import-Datei ein nicht vorgesehener Wert durchschlagen.
Hast du denn mal überprüft, ob vielleicht in der XML-Datei (in der, mit der es abgeraucht ist) in einem Feld "Geburtsdatum" vielleicht "Augsburg" drinsteht o.ä.?
Grüße
Biber
Hallo Crol1234.
In Zeile 5 abwärts habe ich die Konstanten für die Datentypen festgelegt. Diese findest du auf der dort angegebenen Seite im MSDN wieder. adChar (zusammen mit einer festgelegten Stringlänge) oder adVarChar wären hier wohl Typen, die man sinnvollerweise für alphanumerische Daten verwenden würde.
Grüße
rubberman
In Zeile 5 abwärts habe ich die Konstanten für die Datentypen festgelegt. Diese findest du auf der dort angegebenen Seite im MSDN wieder. adChar (zusammen mit einer festgelegten Stringlänge) oder adVarChar wären hier wohl Typen, die man sinnvollerweise für alphanumerische Daten verwenden würde.
Grüße
rubberman