Heute stand ich vor der Aufgabe, aus einer XML-Datei mit Excel (bzw. VBA) gezielt den Inhalt eines bestimmten XML-Elements auszulesen. Am einfachsten macht man sowas natürlich mit XPath, was aber von Excel per se nicht angeboten wird. Mit Excel ist zunächt einmal nur die Verarbeitung von XML im Zusammenhang mit XML-Datenquellen in Form von XML-Schemas möglich. Diese Datenquellen können auch recht einfach angelegt und die entsprechenden Daten im- und exportiert werden: ActiveWorkbook.XmlMaps("Name_der_Zuordnung")
Aber wie gesagt, wollte ich aus einer beliebigen XML-Datei bzw. einem XML-String mittels XPath Elemente auslesen. Hierzu ist zunächst ein Verweis auf die Microsoft XML-Bibliothek zu setzen, die die benötigten Funktionen bereitstellt. Hierzu einfach im VBA-Editor unter Extras -> Verweise einen Verweis auf Microsoft XML, v6.0 (oder welche Version sonst verfügbar/gewünscht ist) setzen.
Danach können XML-Daten wie folgt verarbeitet werden (in meinem Beispiel lese ich den XML-String des Schemas der verknüpften Datenquelle aus):
Sub GetXMLElementExample()
Dim doc As MSXML2.DOMDocument
Dim xmlLoaded As Boolean
Dim kws As IXMLDOMNodeList
Dim kw As IXMLDOMNode
Dim kwIndex As Integer
Set doc = New DOMDocument
xmlLoaded = doc.loadXML(ActiveWorkbook.XmlMaps("XML_Source").Schemas.Item(0).XML)
If Not xmlLoaded Then
' Fehlerbehandlung
Exit Sub
End If
Set kws = doc.selectNodes("/xsd:schema/xsd:simpleType[@name='KWBezeichner']/xsd:restriction/xsd:enumeration/@value")
For kwIndex = 0 To kws.Length - 1
Range("A" & (kwIndex + 1)).Value = kws.Item(kwIndex).Text
Next kwIndex
End Sub
Schöne guten Tag,
deine Seite hat mir einen guten Anstoss gegeben, da ich die XSD-Elemente für eine Liste mit Möglichkeiten zum ausfüllen von XML-Daten gebraucht habe. Nun mein anderes Problem…ich möchte Daten per Makro/VBA hinzufügen und/oder löschen. Habt ihr da einen Tipp für mich?
Du möchtest per Makro Werte in eine Excel-Datei einfügen und dann als XML-Datei exportieren!? Das geht natürlich. Die Frage ist, ob du nicht besser gleich per VBA XML erstellst, anstatt den Umweg über Excel zu gehen.
Solltest du ersteren Weg bevorzugen, kannst du die Werte ganz normal in die Excel-Zellen schreiben, die mit der XML-Quelle verknüpft sind, und dann über ActiveWorkbook.XmlMaps("XML_Source").Save (oder so, weiß ich gerade nicht genau) exportieren…
Also ich habe eine Schemadatei (xsd) und ich lese die Values der Möglichen Werte für die Elemente in Excel per Makro ein. Nun möchte ich die wieder in die Schemadatei schreiben nach Änderung. Dieses funktioniert auch wunderbar, wenn ich nur die Attribute ändere, aber bei hinzukommen eines weiteren Elementes muss ich ja ein weiteres Element in der Schemadatei hinzufügen und da hänge ich gerade fest. Muss ja auch sagen, dass ich nicht wirklich vertraut bin mit Makros in Excel.
Mhh… prinzipiell sollte ein Schema sich ja nicht allzu häufig ändern, aber gut. Wo ist denn jetzt genau dein Problem? Wie liest du die Werte aus und schreibst sie in das Schema?
Mit dem Schema hast du Recht, es sollte sich nicht so häufig ändern.
Also ich lese sie aus, um eine Art DropDown der möglichen Werte zu erstellen. Diese wird dann in einem anderne Tabellenblatt benutzt zum verändern und ausfüllen der XML Daten. Ich müsste per Makro nun weitere ChildNodes in der Schemadatei(XSD) für das jeweilige Element hinzufügen und da hackt es im Moment.
So in der Art sollte es doch gehen, oder nicht?
So komme ich an die ChildElemente ran und ich versuche den parentNode zu erreichen. Vielleicht habe ich einfach auch eine nicht so gute Methode gewählt, um an die Elemente zu kommmen.
Hierdurch kann ich wunderbar die für mich wichtigen Elemente rauslesen und auch ändern.
Du musst als Parent-Element aus deinem obigen Pfad xs:restriction auswählen und dann wie folgt dein neues Element hinzufügen:
bekomme ne Fehlermeldung (Syntaxfehler bei neu.SetAttribute), aber ich werde diesen Ansatz weiter verfolgen.
Habe es nun nach mehrmaligen probieren…try and error sozusagen zu einem Ergebnis gekommen
Jetzt muss ich das ganze noch in eien Schleife packen und dann müsste es eigentlich so hinhauen. Danke nochmal für die Hilfe!
ich habe auch eine Frage, die lautet:
wie ändert sich das xsd Programm,wenn ich so xml(2) Programm bekommen möchte,zumBeispiel:
xml(2):
ABC
BAC
CBA</String<
soweit das xml(1) Programm ich bekommen habe,ZumBeispiel:
xml(1):
ABC
BAC
CBA
das wäre Programm,das durch die xml-Funktion von Excel2003 erstellt wurde, ich meine, wie kriege ich das xml(2),das system hat so gezeigt,dass die Excel den Form von xml(2) nicht akzeptiert, was kann man dafür machen oder änderen, damit man das Form wie xml(2) kriegt…
sry! nochmal,
xml(1):
//
//
// ABC
// BAC
// CBA
//
//
xml(2):
//
//
// ABC
//
//
// BAC
//
//
// CBA
//
//
@kevin: Sorry, ich habe keine Ahnung, was du meinst. Könntest du dich ein wenig klarer ausdrücken?
Hallo Stefan,
kann man mit deinem Code auch ein Xpath Element von einer Webseite auslesen?
Hallo Tobias, grundsätzlich sollte das gehen. Du musst halt nur die XML-Daten in Excel reinbekommen. Aber dafür gibt es bestimmt Mittel in VBA. Viele Grüße! Stefan