Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1792to1796
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

XML auslesen

XML auslesen
24.11.2020 20:13:41
Marc
Guten Abend liebe Forumsgemeinde,
ich möchte ein XML-File auslesen, habe das aber noch nicht oft gemacht. Der Knoten, den ich auslesen möchte sieht wie folgt aus:
<dividendpayment>
<year yr="2017" amount="186.8"/>
<year yr="2018" amount="52.3"/>
</dividendpayment>
Nun versuche ich mit dem folgenden Code eine Collection der ChildNodes zu erhalten über die ich iterieren kann aber es klappt nicht:
Sub XMLTest()
Dim Link As String, Isin As String, ws As Object, xmlDoc As Object, Tag As Object, Collect as   _
_
Object
Set ws = ThisWorkbook.Sheets("Tabelle1")
Isin = ws.Cells(1, 1).Value & ".xml"
Link = "ftp://user:passwort@xxx.xxx.x.xxx/files/" & Isin
Set xmlDoc = CreateObject("Microsoft.XMLDom") 'XMLDocument Object erstellen
xmlDoc.LoadXML (Link)
Set Tag = xmlDoc.getElementsByTagName("dividendpayment")
Set Collect = Tag.getElementsByTagName("year")
End Sub

Fehlermeldung: "Objekt unterstützt diese Eigenschaft oder Methode nicht." (Bezieht sich auf die letzte Codezeile.)
Wie komme ich an die Werte in diesem Knotenpunkt?
VG,
Marc

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: XML auslesen
24.11.2020 21:25:22
Marc
Also wie ich nun feststelle ist es ganz gleich wo ich den File platziere, auf dem FTP auf meinem Desktop oder sonst wo. Das Ding wird schlicht nicht importiert scheint es mir und deshalb taucht letztlich vermutlich auch der Fehler auf wenn ich versuche die DOM Struktur auszulesen.
Ich habe den File aktuell auf dem Desktop liegen und versuche es wie folgt:
Sub XMLTest()
Dim Link As String, xmlDoc As Object
Link = "C:\Users\xxxxxx_xxxxxx\Desktop\C:\DE0006969603.xml"
Set xmlDoc = CreateObject("Microsoft.XMLDom")
xmlDoc.LoadXML (Link)
Debug.Print xmlDoc.NodeList        ' "Objekt unterstützt diese Methode nicht"
End Sub
Woran kann es liegen, dass die XML-datei nicht geladen wird?
Anzeige
AW: XML auslesen
24.11.2020 22:57:56
Yal
Hallo Marc,
"Basiskenntnisse in VBA" ?
Ich habe seit langem nicht mehr mit xml gespielt. Versuchen wir trotzdem zu helfen.
getElementsByTagName liefert eine Auflistung, daher kannst Du nicht direkt
Tag.getElementsByTagName("..")

sondern muss als
Tag(1).getElementsByTagName("..")
aufrufen werden.
Ich würde die Bibliothek anbinden "Extras>>Verweise..." dann "Microsoft XML, v6" und die Objekt damit instanzieren, anstatt CreateObject. Es hat das Vorteil, dass Du dann IntelliSense zur Verfügung hast: u.a. die Eigenschaft und Methode mit Strg+Leertaste vorgeschlagen, also weniger Suchen und weniger Fehler.
Dein xmlDoc, Tag und co sind dann
Dim xmlDom as IXMLDOMDocument2
Dim Tag as IXMLDOMNodeList
Mit Strg+F1 auf einem Sprachelement aus der Bib kommst Du in die Online-Hilfe. Da sind nutzvolle Beispiele und Verlinkungen.
Viel Efolg
Yal
Anzeige
AW: XML auslesen
24.11.2020 23:20:29
Marc
Ja, Basiskenntnisse VBA. =) Es gibt eine Unmenge an Anwendungsmöglichkeiten und mit XML bin ich nunmal wenig vertraut. Trotzdem hab ich schon zahlreiche Makros geschrieben.
Leider hattest Du meinen Nachtrag vollkommen ausgeblendet. So wie ich das sehe wird nämlich überhaupt kein XML File importiert. Das DOM-Objekt zeigt im Überwachungsfenster keinerlei ChildNodes oder ähnliches an.
Auch wenn ich die Datei direkt vom Desktop importieren will, anstatt vom FTP Server, bleibt das Objekt leer. Ich nehme an hier liegt irgendwie ein Problem mit der XML Version vor. Der File hat das Format XML1.0 UTF 8 Unicode.
Irgendwer eine Idee?
Der Direktimport in Excel schlägt übrigens auch fehl.
Anzeige
AW: Powershell
25.11.2020 07:58:20
Fennek
Hallo,
auch wenn VBA jede txt-Datei mit "OPEN file" einlesen kann, Powershell bietet "up-to-date" Möglichkeiten XML-Dateien zu bearbeiten.
Also entweder in einem Powershell - Forum fragen, oder zumndest eine möglichst kleine, aber lauffähige Test-Datei hochladen.
mfg
AW: XML auslesen
25.11.2020 13:15:38
Tino
Hallo,
kannst es mal so versuchen.
Sub Test()
Dim XML As Object, XMLNode As Object
Dim sPathXML$, r&
sPathXML = "G:\1 Forum\XML\Meine_XML.xml"
Set XML = CreateObject("MSXML2.DOMDocument")
XML.Load sPathXML
With Tabelle1
.Range("A2:B" & .Rows.Count).Clear
End With
r = 2
For Each XMLNode In XML.SelectNodes("dividendpayment/year")
With XMLNode.Attributes
If Not .getNamedItem("yr") Is Nothing Then
Tabelle1.Cells(r, 1).Value = .getNamedItem("yr").Text
End If
If Not .getNamedItem("amount") Is Nothing Then
Tabelle1.Cells(r, 2).Value = .getNamedItem("amount").Text
End If
End With
r = r + 1
Next
End Sub
Gruß Tino
Anzeige
AW: XML auslesen
25.11.2020 14:23:39
Marc
Mit dem Dateiformat ".xml" klappt der Import seltsamerweis ein keinem der Fälle, weder mit Early noch mit Late Binding. Mit dem Dateiformat ".txt" klappt der Import zumindest bei einer anderen datei, die mir vorliegt.
Der Unterschied zur Problemdatei ist, dass Lehrzeilen zwischen den einzelnen Knoten sind.
Kann es sein, dass hier der Hund begraben liegt?
AW: XML auslesen
25.11.2020 14:59:53
Tino
Hallo,
dann Mal ein Beispiel hochladen wo es nicht geht.
Gruß Tino
AW: XML auslesen
25.11.2020 17:45:34
Marc
Hi Tino,
hätte ich schon getan. Das Problem ist jedoch, dass die Datei urheberrechtlich geschützt ist. Ich darf sie nicht öffentlich zugänglich machen oder weitergeben.
Sind Leerzeilen grundsätzlich ein Problem wenn man Daten in ein XML DOM-Objekt importiert?
Anzeige
AW: XML auslesen
25.11.2020 17:58:49
Tino
Hallo,
du kannst die Datei zu Testzwecken mit anderen Daten füllen, nur das Problem sollte bestehen bleiben.
Eigentlich denke ich das Leerzeile kein Problem darstellen sollten, genau so wie Zeilenumbrüche.
Getestet habe ich es noch nie!
Man kann den Inhalt auch als String einlesen und die Leerzeile aus diesem String löschen.
Diesen String kann man wiederum als Dom Dokument laden.
Gruß Tino
AW: XML auslesen
25.11.2020 19:09:47
Marc
Hi Tino,
die Datei mit anderen Daten zu füllen wäre etwas aufwendig aber ich glaube ich habe die Ursache gefunden. Ich habe nämlich mal versucht mit der ImportXML Methode zu arbeiten und dabei ist der folgende Fehler aufgetreten:
Laufzeitfehler ....   "DTD nicht zulässig."
Und in meinem XML-File ist ein entsprechender DTD Eintrag.
<!DOCTYPE companyprofile SYSTEM "companyprofile.dtd">
Ich würde jetzt mal vermuten, dass dieser DTD Eintrag auch das Einlesen der Datei in das XML-Objekt verhindert.
Wie kann man dieses Problem denn beheben?
Anzeige
AW: XML auslesen
25.11.2020 21:15:05
Yal
"In SGML muss jedem Dokument zwingend eine DTD zugeordnet sein. In XML ist diese Zuordnung optional. "
(aus https://de.wikipedia.org/wiki/Dokumenttypdefinition )
Die ganze Zeile einfach löschen (<!...> ist selbstschliessend ).
Viel Erfolg
Yal
AW: XML auslesen
25.11.2020 21:21:42
Marc
Ah, gerade hatte ich auch nochmal meine neuesten Erkenntnisse dazu geposted.
Aber ja, das mit dem Löschen hatte ich tatsächlich auch schonmal versucht, da ich diese Zeile als wesentlichen Unterschied zu anderen XML Files identifiert hatte, jedoch ohne Erfolg. Ich versuche es aber nochmal.
Anzeige
AW: XML auslesen
25.11.2020 21:19:22
Marc
Ich bin ein Stück weiter und habe nun herausgefunden, dass man die DTD Eigenschaft beim Einlesen ignorieren kann mit Hilfe der "XmlResolver" Methode.
Weiß jemand wie ich diese Mthode beim Einlesen in ein DOM-Objekt oder bei Anwendung der XmlImport Methode verwende?
AW: XML auslesen
25.11.2020 21:20:06
Tino
Hallo,
wie schon geschrieben.
Lese die Datei in einen String ein und lösche die Zeile.
Dann anstatt XML.load(Pfad) diesen String mit XML.loadxml(String) laden.
Gruß Tino
AW: XML auslesen
25.11.2020 21:24:03
Marc
Ok, werde ich dann auch mal versuchen. Ich denke das sollte doch irgendwie hinhauen. =)
AW: XML auslesen
25.11.2020 22:03:31
Marc
Das schien zunächst erfolgversprechend, allerdings scheitert das Einlesen in das DOM Objekt nun offenbar an einem Parse Error, den ich im Lokalfenster angezeigt bekomme. Offenbar erwartet der Parser an manchen Stellen andere Zeichen und bricht den Parsevorgang deshalb ab. Zum Beispiel mag er an bestimmten Stellen keine Leerzeichen und erwartet dafür an anderen Stellen Semikolons. Der Code läuft jedoch durch ohne, dass ein Fenster mit einer Fehlermeldung aufpoppt.
Eine Idee wie man das beheben kann?
Anzeige
AW: XML auslesen
25.11.2020 23:19:45
Marc
Problem gelöst.
XML File in einem Online XML Viewer geöffnet, ins Clipboard kopiert, anschschließend in eine Textdatei kopiert, Zeile mit DTD Eintrag gelöscht und abgespeichert.
Anschließend mit XmlDoc.Loadxml (String) eingelesen und fertig. Funktioniert wunderbar. Ganz herzlichen Dank an alle für die Unterstützung!
AW: XML auslesen
26.11.2020 03:04:27
Tino
Hallo,
sollte es noch interessieren, hier eine Version die diese Zeile zuvor aus dem String löscht.
Sub Test()
Dim XML As Object, XMLNode As Object
Dim sPathXML$, r&, sXMLString$
sPathXML = "G:\1 Forum\XML\Meine_XML.xml"
Set XML = CreateObject("MSXML2.DOMDocument")
sXMLString = LeseXMLFile(sPathXML)
XML.LoadXML sXMLString
With Tabelle1
.Range("A2:B" & .Rows.Count).Clear
End With
r = 2
For Each XMLNode In XML.SelectNodes("dividendpayment/year")
With XMLNode.Attributes
If Not .getNamedItem("yr") Is Nothing Then
Tabelle1.Cells(r, 1).Value = .getNamedItem("yr").Text
End If
If Not .getNamedItem("amount") Is Nothing Then
Tabelle1.Cells(r, 2).Value = .getNamedItem("amount").Text
End If
End With
r = r + 1
Next
End Sub
Function LeseXMLFile(sPath$) As String
Dim F%, sInhalt$, Regex As Object
F = FreeFile
Open sPath For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close
Set Regex = CreateObject("Vbscript.Regexp")
With Regex
.MultiLine = True
.Pattern = "+>\n?"
.Global = True
.IgnoreCase = True
If .Test(sInhalt) Then
sInhalt = .Replace(sInhalt, "")
End If
End With
LeseXMLFile = sInhalt
End Function
Gruß Tino
Anzeige
AW: XML auslesen
26.11.2020 03:07:26
Tino
Hallo,
ersetze die Zeile
.Pattern ...
durch diese
.Pattern = "<!DOCTYPE.+>\n?"
wird hier im Forum nicht richtig dargestellt
Gruß Tino
AW: XML auslesen
26.11.2020 20:01:29
Marc
Hi Tino,
herzlichen Dank dafür! Werde ich ausprobieren.
VG

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige