crol1234
Goto Top

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 face-smile (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

Content-ID: 178747

Url: https://administrator.de/contentid/178747

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

rubberman
rubberman 11.01.2012 um 16:11:48 Uhr
Goto Top
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
Crol1234
Crol1234 11.01.2012 um 16:23:16 Uhr
Goto Top
Hallo rubberman,

also ich versuche mitzukommen,

die datei hat folgenden anfang <?xml version="1.0" encoding="ISO-8859-1"?>
und es befinden sich u.a. "ü" oder "&" im Text

Der Aufbau sieht wie folgt aus:
<?xml version="1.0" encoding="ISO-8859-1"?>  
-<WebInfo CreationTime="20120111152034" Installation="xxx" Version="1.4">  
<Centerlist>
<Center...... />
</Centerlist>
<Filmlist>
<Film......../>
<Centersplayed>
<CenterOID "......:" />  
</Centersplayed>
.
.
.
.
</Filmlist>
<PerformanceList>
<Performance "...... " />  
.
.
.
</PerformanceList>
</Webinfo>
rubberman
rubberman 11.01.2012 um 16:41:02 Uhr
Goto Top
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
Crol1234
Crol1234 11.01.2012 um 16:43:26 Uhr
Goto Top
gut damit kann ich jetzt garnix anfangen ,, mir geht es nur darum dass ich irgendwie was ausführbares brauch wo man jetzt nicht irgendwelche umgebungen installieren muss?
wie das umgesetzt ist , ist eigentlich egal.
rubberman
rubberman 11.01.2012 um 19:11:51 Uhr
Goto Top
Hallo Crol1234.

[...] 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
Crol1234
Crol1234 11.01.2012 um 19:18:10 Uhr
Goto Top
funktioniert gut, kleinigkeit: PerformanceTitle wird abgeschnitten nach einer gewissen Anzahl an Buchstaben.
Kann man die Zeiten noch durch ein : trennen?

Kann man eine Sortierung stattfinden lassen zuerst nach Datum und dann Nach Starttime?
rubberman
rubberman 11.01.2012 um 19:31:56 Uhr
Goto Top
Hallo Crol1234.

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
Crol1234
Crol1234 11.01.2012 um 19:40:28 Uhr
Goto Top
hoppla, ja natürlich FilmTitle ist besser face-smile

wie kann ich noch am Anfang des Dokumentes

Datum;Startzeit;Endzeit;Saal;Filmtitel;FSK

ausgeben lassen?
Sonst hab ich in der Tabelle die Daten aus der ersten Zeile in der Tabellenüberschrift

und wie bekommt man das Sternchen bei manchen Filmtitle entfernt?
rubberman
rubberman 11.01.2012 um 19:56:14 Uhr
Goto Top
Hallo Crol1234.

Vor Zeile 30
txt = "Datum;Startzeit;Endzeit;Saal;Filmtitel;FSK" & vbCrLf

und wie bekommt man das Sternchen bei manchen Filmtitle entfernt?
Wie kommt es denn in die XML (lass es doch raus, wenn es schon deine eigene XML ist).

Grüße
rubberman
Crol1234
Crol1234 11.01.2012 um 20:37:05 Uhr
Goto Top
die datei wird von unserem kassensystem erstellt. das kann ich so nicht beinflussen. da hängt zuviel dran.
rubberman
rubberman 11.01.2012 um 21:42:36 Uhr
Goto Top
Hallo Crol1234,

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. />
Biber
Biber 11.01.2012 um 23:23:49 Uhr
Goto Top
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 face-smile 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
rubberman
rubberman 12.01.2012 um 00:26:25 Uhr
Goto Top
Hallo Biber.

Gefällt mir -sogar ohne Kommentarzeilen im Source face-smile 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 face-wink

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
Crol1234
Crol1234 12.01.2012 um 07:16:38 Uhr
Goto Top
einfach perfekt. Großes Lob für die aufgebrachte Mühe! wieder was gelernt...
Crol1234
Crol1234 16.02.2012 um 14:27:10 Uhr
Goto Top
das skript lief lange zeit perfekt, bis heute: seitdem kommt der fehler:

Zeile 70
Zeichen: 3
Fehler: Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.
Code: 800A0BB9
Quelle: ADODB.Recordset
Biber
Biber 17.02.2012 um 18:35:09 Uhr
Goto Top
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
Crol1234
Crol1234 17.02.2012 um 19:03:02 Uhr
Goto Top
habe es gefunden, war ei ? in einem Feld für Zahlen und zwar FSK, wie mache ich das unempfindlich gegen Sonderzeichen oder Buchstaben?
bastla
bastla 17.02.2012 um 21:04:03 Uhr
Goto Top
Hallo Crol1234!
wie mache ich das unempfindlich gegen Sonderzeichen oder Buchstaben?
Schau Dir doch mal die (inzwischen doch wirklich aussagekräftige formulierte) Zeile 58 und einige knapp davor an ...

Grüße
bastla
rubberman
rubberman 18.02.2012 um 18:00:17 Uhr
Goto Top
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