{"id":55001050,"date":"2016-08-01T00:00:00","date_gmt":"2021-03-22T16:34:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1050"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XMLZugriff_per_VBA_XPath","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/","title":{"rendered":"XML-Zugriff per VBA XPath"},"content":{"rendered":"<p><b>XML-Dokumente erscheinen je nach Gr\u00f6\u00dfe auf den ersten Blick oft un\u00fcbersichtlich und m\u00e4chtig. Wie soll man hier die gew\u00fcnschten Daten extrahieren &#8211; und das auch noch programmgesteuert per VBA Beispielsweise, um Informationen aus einem XML-Dokument in eine Access-Tabelle zu \u00fcbertragen. Daf\u00fcr steht die Abfragesprache VBA XPath zur Verf\u00fcgung. Sie erlaubt es, mit verschiedenen Ausdrucken gezielt auf Elemente mit bestimmten Namen oder Eigenschaften zuzugreifen. Dieser Beitrag zeigt anhand einiger Beispiele, wie Sie XPath unter Access\/VBA einsetzen.<\/b><\/p>\n<h2>Voraussetzungen f\u00fcr VBA XPath<\/h2>\n<p>Um die folgenden Beispiele auszuf\u00fchren, ben\u00f6tigen Sie eine Beispieldatenbank mit einem Verweis auf die XML-Bibliothek von Microsoft. Dazu \u00f6ffnen Sie den Verweise-Dialog (VBA-Editor, Men\u00fceintrag <b>Extras|Verweise<\/b>) und w\u00e4hlen dort den Eintrag <b>Microsoft XML, v3.0 <\/b>aus (s. Bild 1). Mit <b>Microsoft XML, v6.0 <\/b>gab es bei der Erstellung der Beispiele Probleme, da hier einige Methoden nicht die erwarteten Ergebnisse lieferten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_04\/pic_1050_001.png\" alt=\"Hinzuf\u00fcgen des Verweises auf die XML-Bibliothek\" width=\"424,6255\" height=\"334,748\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 1: Hinzuf\u00fcgen des Verweises auf die XML-Bibliothek<\/span><\/b><\/p>\n<h2>Beispieldokument<\/h2>\n<p>Um per VBA XPath auf den Inhalt eines XML-Dokuments zugreifen zu k\u00f6nnen, ben\u00f6tigen Sie zun\u00e4chst ein solches. Unseres hei\u00dft <b>KategorienUndArtikel.xml <\/b>und sollte sich im gleichen Verzeichnis wie die Beispieldatenbank befinden, da die Zugriffe auf diese Datei dahingehend ausgerichtet sind. Der Inhalt dieser XML-Datei sieht wie in Listing 1 aus.<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-16\"&gt;\n&lt;Bestellverwaltung xmlns=\"http:\/\/www.w3.org\/TR\/REC-html40\"&gt;\n   &lt;Kategorie KategorieID=\"1\"&gt;\n     &lt;Kategoriename&gt;Getr\u00e4nke&lt;\/Kategoriename&gt;\n     &lt;Beschreibung&gt;Alkoholfreie Getr\u00e4nke, Kaffee, Tee, Bier&lt;\/Beschreibung&gt;\n     &lt;Artikel ArtikelID=\"1\"&gt;\n       &lt;Artikelname&gt;Chai&lt;\/Artikelname&gt;\n       &lt;Einzelpreis&gt;EUR 9.00&lt;\/Einzelpreis&gt;\n     &lt;\/Artikel&gt;\n     &lt;Artikel ArtikelID=\"2\"&gt;\n       &lt;Artikelname&gt;Chang&lt;\/Artikelname&gt;\n       &lt;Einzelpreis&gt;EUR 9.50&lt;\/Einzelpreis&gt;\n     &lt;\/Artikel&gt;\n     ..\n   &lt;\/Kategorie&gt;\n   &lt;Kategorie KategorieID=\"2\"&gt;\n     &lt;Kategoriename&gt;Gew\u00fcrze&lt;\/Kategoriename&gt;\n     &lt;Beschreibung&gt;S\u00fc\u00dfe und saure So\u00dfen, Gew\u00fcrze&lt;\/Beschreibung&gt;\n     &lt;Artikel ArtikelID=\"3\"&gt;\n       &lt;Artikelname&gt;Aniseed Syrup&lt;\/Artikelname&gt;\n       &lt;Einzelpreis&gt;EUR 5.00&lt;\/Einzelpreis&gt;\n     &lt;\/Artikel&gt;\n     &lt;Artikel ArtikelID=\"4\"&gt;\n       &lt;Artikelname&gt;Chef Anton''''s Cajun Seasoning&lt;\/Artikelname&gt;\n       &lt;Einzelpreis&gt;EUR 11.00&lt;\/Einzelpreis&gt;\n     &lt;\/Artikel&gt;\n   ...\n   &lt;\/Kategorie&gt;\n   ...\n&lt;\/Bestellverwaltung&gt;<\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 1: XML-Dokument f\u00fcr die Beispiele dieses Beitrags<\/span><\/b><\/p>\n<h2 data-tadv-p=\"keep\">Zugriff mit VBA XPath \u00fcber den Speicher<\/h2>\n<p>Um per VBA XPath auf ein XML-Dokument zugreifen zu k\u00f6nnen, m\u00fcssen Sie dieses zun\u00e4chst in den Speicher laden, beziehungsweise es mit einem geeigneten Objekt referenzieren. Dies erledigen Sie mit dem Code, wie er etwa in der folgenden Prozedur enthalten ist:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>DokumentLaden()\n     <span style=\"color: blue;\">Dim <\/span>strDatei<span style=\"color: blue;\"> As String<\/span>\n     <span style=\"color: blue;\">Dim <\/span>objXML<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     strDatei =  CurrentProject.Path &amp; \"KategorienUndArtikel.xml\"\n     <span style=\"color: blue;\">Set<\/span> objXML = <span style=\"color: blue;\">New<\/span> MSXML2.DOMDocument\n     objXML.Load strDatei\n     <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> <span style=\"color: blue;\">Len<\/span>(objXML.XML) = 0<span style=\"color: blue;\"> Then<\/span>\n         <span style=\"color: blue;\">Debug.Print<\/span> objXML.XML\n     <span style=\"color: blue;\">Else<\/span>\n         <span style=\"color: blue;\">Debug.Print<\/span> objXML.parseError.errorCode,  objXML.parseError.reason\n     <span style=\"color: blue;\">End If<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur erstellt ein neues Objekt des Typs <b>DOMDocument <\/b>und verwendet die <b>Load<\/b>-Methode, um die angegebene Datei in das Objekt zu laden. Gelingt dies, sollte die L\u00e4nge der \u00fcber die Eigenschaft <b>XML <\/b>zu ermittelnde Zeichenkette, also der Inhalt des Dokuments, gr\u00f6\u00dfer als <b>0 <\/b>sein. In diesem Fall soll die Prozedur den Inhalt des XML-Dokuments im Direktbereich des VBA-Editors ausgeben. Anderenfalls ist etwas beim Einlesen schiefgelaufen. Dann soll die Fehlernummer samt der Fehlerbeschreibung im Direktbereich erscheinen.<\/p>\n<h2>XPath per VBA nutzen<\/h2>\n<p>Um die Abfragesprache XPath von VBA aus nutzen zu k\u00f6nnen, gibt es zwei Funktionen. Die erste hei\u00dft <b>selectSingleNode <\/b>und erwartet einen <b>XPath<\/b>-Ausdruck als Parameter. Sie liefert ein einziges <b>Node<\/b>-Element als Ergebnis zur\u00fcck, sofern die Abfrage ein Ergebnis hat.<\/p>\n<p>Die zweite Funktion hei\u00dft <b>selectNodes <\/b>und liefert eine Auflistung des Typs <b>DOMSelection <\/b>zur\u00fcck. Sie kann kein, ein oder mehrere Elemente enthalten, die wiederum den Typ <b>DOMDocument <\/b>f\u00fcr das Dokument-Objekt, <b>IXMLDOMProcessingInstruction <\/b>f\u00fcr das <b><\/b>-Element oder <b>IXMLDOMElement <\/b>f\u00fcr die \u00fcbrigen Elemente aufweisen.<\/p>\n<p>\u00fcblicherweise werden Sie aber mit den Elementen des Typs <b>IXMLDOMElement <\/b>arbeiten, ein Zugriff auf das <b>DOMDocument<\/b>-Objekt oder das <b>IXMLDOMProcessingInstruction<\/b>-Objekt ist selten in Zusammenhang mit dem Zugriff per XPath n\u00f6tig.<\/p>\n<p>Unsere Beispielprozedur f\u00fcr das Erstellen eines XML-Dokuments und das F\u00fcllen dieses Objekts aus einer XML-Datei haben wir etwas abgewandelt, damit wir damit mit einer Anweisung innerhalb unserer Beispielprozeduren auf das XML-Dokument zugreifen k\u00f6nnen (s. Listing 2).<\/p>\n<pre><span style=\"color: blue;\">Public Function <\/span>GetDocument()<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>strDatei<span style=\"color: blue;\"> As String<\/span>\n     <span style=\"color: blue;\">Dim <\/span>objXML<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     strDatei = CurrentProject.Path &amp; \"KategorienUndArtikel.xml\"\n     <span style=\"color: blue;\">Set<\/span> objXML = <span style=\"color: blue;\">New<\/span> MSXML2.DOMDocument\n     objXML.Load strDatei\n     <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> <span style=\"color: blue;\">Len<\/span>(objXML.XML) = 0<span style=\"color: blue;\"> Then<\/span>\n         <span style=\"color: blue;\">Set<\/span> GetDocument = objXML\n     <span style=\"color: blue;\">Else<\/span>\n         <span style=\"color: blue;\">MsgBox<\/span> \"Fehler \" &amp; objXML.parseError.errorCode &amp; \": \" &amp; objXML.parseError.reason\n     <span style=\"color: blue;\">End If<\/span>\n<span style=\"color: blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 2: Hilfsfunktion, um ein gef\u00fclltes DOMDocument-Element zu holen<\/span><\/b><\/p>\n<h2>Auf das Root-Element zugreifen<\/h2>\n<p>Ein Beispiel f\u00fcr den Zugriff auf ein einzelnes XML-Element sieht danach wie folgt aus:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>RootelementHolen()\n     <span style=\"color: blue;\">Dim <\/span>objElement<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objElement = _\n         objDocument.selectSingleNode(\"Bestellverwaltung\")\n     <span style=\"color: blue;\">Debug.Print<\/span> objElement.XML\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Dies liest das Element <b>Bestellverwaltung <\/b>samt allen untergeordneten Elementen ein. Wenn wir wie in obiger Beispielprozedur den Inhalt der XML-Eigenschaft im Direktbereich ausgeben, erhalten wir also fast das komplette Dokument &#8211; mit Ausnahme der Formatinformationen in der <b><\/b>-Zeile.<\/p>\n<p>Dies gelingt aber auch nur \u00fcber den VBA XPath-Ausdruck <b>Bestellverwaltung<\/b>, weil wir die <b>selectSingleNode<\/b>-Funktion f\u00fcr das <b>DOMDocument<\/b>-Objekt aufrufen und das Bestellverwaltung-Objekt diesem direkt untergeordnet ist.<\/p>\n<p>Wir k\u00f6nnten also nicht etwa auf das erste <b>Kategorie<\/b>-Objekt zugreifen, indem wir einfach folgenden Ausdruck nutzen:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode(\"Kategorie\")<\/pre>\n<p>Wenn wir dies versuchen, erhalten wir eine Fehlermeldung wie in Bild 2. Die Anweisung <b>Set objElement&#8230; <\/b>l\u00f6st zwar noch keinen Fehler aus. Aber <b>objElement <\/b>wird hier nicht gef\u00fcllt und der folgende Zugriff auf eine Eigenschaft von <b>objElement <\/b>f\u00fchrt dann zum Fehler.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_04\/pic_1050_002.png\" alt=\"Fehler beim Zugriff auf ein XML-Element\" width=\"649,4275\" height=\"386,2157\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 2: Fehler beim Zugriff auf ein XML-Element<\/span><\/b><\/p>\n<h2>Auf ein direktes Unterelement des Root-Elements zugreifen<\/h2>\n<p>Mit dem Namen eines Elements allein k\u00f6nnen Sie also nur auf ein Element zugreifen, wenn sich dieses direkt unterhalb des Objekts befindet, f\u00fcr das Sie die <b>SelectSingleNode<\/b>-Methode aufrufen.<\/p>\n<p>Daf\u00fcr m\u00fcssten Sie zuerst das Root-Element <b>Bestellverwaltung <\/b>per <b>IXMLDomElement<\/b>-Variable referenzieren und k\u00f6nnten dann von dort aus auf das <b>Kategorie<\/b>-Element zugreifen:<\/p>\n<pre><span style=\"color: blue;\">Dim <\/span>objBestellverwaltung<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n<span style=\"color: blue;\">Dim <\/span>objKategorie<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n<span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n<span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n<span style=\"color: blue;\">Set<\/span> objBestellverwaltung =  objDocument.selectSingleNode(\"Bestellverwaltung\")\n<span style=\"color: blue;\">Set<\/span> objKategorie = objBestellverwaltung. selectSingleNode(\"Kategorie\")\n<span style=\"color: blue;\">Debug.Print<\/span> objKategorie.XML<\/pre>\n<p>Dies gibt den Inhalt des ersten <b>Kategorie<\/b>-Elements aus.<\/p>\n<p>An dieser Stelle ist es wichtig zu erw\u00e4hnen, dass die <b>SelectSingleNode <\/b>immer das erste Element liefert, das dem angegebenen Ausdruck entspricht. W\u00e4hrend es nur ein <b>Bestellverwaltung<\/b>-Element gibt, befinden sich darunter allerdings gleich sieben <b>Kategorie<\/b>-Elemente. Davon liefert <b>SelectSingleNode <\/b>dann das erste.<\/p>\n<h2>Auf mehrere Elemente zugreifen<\/h2>\n<p>Das ist ein guter Anlass, die Funktion <b>selectNodes <\/b>vorzustellen. Sie liefert nicht nur ein einziges Element zur\u00fcck, sondern kann auch einmal kein oder mehrere Elemente zur\u00fcckgeben. Diese kommen immer in einer Auflistung vom Typ <b>DOMSelection<\/b>.<\/p>\n<p>Wenn Sie die gefundenen Elemente mit der <b>For Each<\/b>-Schleife durchlaufen wollen, definieren Sie wie im folgenden Beispiel sowohl ein Objekt namens <b>objKategorie <\/b>mit dem Typ <b>IXMLDOMElement <\/b>als Laufvariable sowie eines f\u00fcr die Auflistung namens <b>objKategorien <\/b>mit dem Typ <b>IXMLDOMSelection<\/b>.<\/p>\n<p>Dann referenzieren Sie wieder das Root-Element und nutzen dann dessen <b>selectNodes<\/b>-Funktion, um alle untergeordneten <b>Kategorie<\/b>-Elemente zu ermitteln. Diese landen dann im Auflistungsobjekt <b>objKategorien<\/b>. Dieses k\u00f6nnen wir dann per <b>For Each<\/b>-Schleife mit der Laufvariablen <b>objKategorie <\/b>durchlaufen. Innerhalb der Schleife geben wir wieder den Inhalt der XML-Eigenschaft aus:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>KategorienHolen()\n     <span style=\"color: blue;\">Dim <\/span>objBestellverwaltung<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objKategorie<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objKategorien<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objBestellverwaltung =  objDocument.selectSingleNode(\"Bestellverwaltung\")\n     <span style=\"color: blue;\">Set<\/span> objKategorien =  objBestellverwaltung.selectNodes(\"Kategorie\")\n     For Each objKategorie In objKategorien\n         <span style=\"color: blue;\">Debug.Print<\/span> objKategorie.XML\n     <span style=\"color: blue;\">Next<\/span> objKategorie\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Da die Ausgabe alle <b>Kategorie<\/b>-Elemente umfasst, die selbst jeweils einige <b>Artikel<\/b>-Elemente enthalten, sprengt die Ausgabe das Direktfenster. Also geben wir etwas weniger Umfangreiches aus, indem wir die <b>Debug.Print<\/b>-Anweisung wie folgt ersetzen und damit gleich noch einen einfachen XPath-Ausdruck nutzen:<\/p>\n<pre><span style=\"color: blue;\">Debug.Print<\/span> objKategorie.selectSingleNode( \"Kategoriename\").nodeTypedValue<\/pre>\n<p>Da wir in diesem Fall nicht einfach den Inhalt der Eigenschaft <b>XML <\/b>ausgeben wollen, sondern den Inhalt des Elements <b>Kategoriename <\/b>selbst, verwenden wir die Eigenschaft <b>nodeTypedValue<\/b>.<\/p>\n<p>Die gefundenen Elemente k\u00f6nnen Sie auch per <b>For&#8230;Next<\/b>-Schleife durchlaufen. Dann nutzen Sie die <b>length<\/b>-Eigenschaft der <b>IXMLDOMSelection<\/b>-Auflistung zur Bestimmung der Anzahl der Elemente.<\/p>\n<p>\u00fcber die <b>Item()<\/b>-Eigenschaft greifen Sie dann auf das jeweilige Element zu, wobei der Index 0-basiert ist, was f\u00fcr den Wertebereich der Schleife ber\u00fccksichtigt werden muss:<\/p>\n<pre><span style=\"color: blue;\">Dim <\/span>i<span style=\"color: blue;\"> As Integer<\/span>\n...\n<span style=\"color: blue;\">Set<\/span> objKategorien =  objBestellverwaltung.selectNodes(\"Kategorie\")\nFor i = 0 To objKategorien.length - 1\n     <span style=\"color: blue;\">Debug.Print<\/span> objKategorien.Item(i).selectSingleNode( \"Kategoriename\").nodeTypedValue\n<span style=\"color: blue;\">Next<\/span> i<\/pre>\n<h2>Beispiele f\u00fcr XPath-Ausdr\u00fccke<\/h2>\n<p><!--30percent--><\/p>\n<\/p>\n<p>Nachdem Sie nun erfahren haben, wo und wie Sie \u00fcberhaupt XPath-Ausdr\u00fccke einsetzen k\u00f6nnen (wobei wir ja immer nur den Namen eines Elements als Ausdruck angegeben haben), wollen wir uns nun die wichtigsten Beispiele f\u00fcr XPath-Ausdr\u00fccke ansehen.<\/p>\n<p>Dabei ist immer der Kontext wichtig, also von welchem Element des XML-Dokuments aus Sie das betroffene Element referenzieren wollen. F\u00fcr die ersten Beispiele gehen wir jeweils vom Root-Element aus, also vom Element <b>Bestellverwaltung<\/b>.<\/p>\n<h2>Zugriff auf Enkel-Elemente<\/h2>\n<p>Wenn Sie direkt vom <b>DOMDocument<\/b>-Objekt auf die <b>Kategorie<\/b>-Elemente unterhalb von <b>Bestellverwaltung <\/b>zugreifen wollen, gelangen Sie so dorthin:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objKategorien =  objDocument.selectNodes(\"Bestellverwaltung\/Kategorie\")\nFor i = 0 To objKategorien.length - 1\n     <span style=\"color: blue;\">Debug.Print<\/span> objKategorien.Item(i).selectSingleNode( \"Kategoriename\").nodeTypedValue\n<span style=\"color: blue;\">Next<\/span> i<\/pre>\n<h2>Alle Elemente mit bestimmtem Namen<\/h2>\n<p>Wenn Sie alle Elemente eines Dokuments mit einem bestimmten Namen finden wollen, k\u00f6nnen Sie den Ausdruck <b>\/\/Kategorie <\/b>verwenden:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objKategorien = objDocument.selectNodes(\"\/\/Kategorie\")<\/pre>\n<p>Vorsicht, wenn sich auch in anderen Ebenen noch Elemente des gleichen Namens befinden &#8211; die werden dann auch ber\u00fccksichtigt.<\/p>\n<p>Wenn Sie beispielsweise alle Elemente namens <b>Artikelname <\/b>ermitteln wollen, die sich unterhalb des Elements <b>Artikel <\/b>befinden, gelingt dies so:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objArtikel =  objDocument.SelectNodes(\"\/\/Artikel\/Artikelname\")<\/pre>\n<h2>Alle Elemente mit VBA XPath ermitteln<\/h2>\n<p>Sollten Sie \u00fcberhaupt alle Elemente eines Dokuments durchlaufen wollen, dann nutzen Sie den XPath-Ausdruck <b>\/\/*<\/b>. Die Elemente werden dann von oben nach unten durchlaufen:<\/p>\n<pre><span style=\"color: blue;\">Dim <\/span>objObjects<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n<span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n<span style=\"color: blue;\">Dim <\/span>i<span style=\"color: blue;\"> As Integer<\/span>\n<span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n<span style=\"color: blue;\">Set<\/span> objObjects = objDocument.selectNodes(\"\/\/*\")\nFor i = 0 To objObjects.length - 1\n     <span style=\"color: blue;\">Debug.Print<\/span> objObjects.Item(i).baseName\n<span style=\"color: blue;\">Next<\/span> i<\/pre>\n<p>Hier verwenden wir wieder einmal die Eigenschaft <b>baseName<\/b>, um einfach die Namen der enthaltenen Elemente auszugeben. Die Ausgabe sieht dann etwa so aus:<\/p>\n<pre>Bestellverwaltung\nKategorie\nKategoriename\nBeschreibung\nArtikel\nArtikelname\nEinzelpreis\nArtikel\nArtikelname\nEinzelpreis\nArtikel\nArtikelname\n...<\/pre>\n<h2>Von oben nach unten mit VBA XPath<\/h2>\n<p>Wenn Sie auf Nummer sicher gehen wollen und wissen, wo sich das gesuchte Element befindet, k\u00f6nnen Sie die Elemente von oben nach unten als XPath-Ausdruck angeben. Um zum Beispiel den Namen des ersten Artikels auszugeben, verwenden Sie den Ausdruck <b>Bestellverwaltung\/Kategorie\/Artikel\/Artikelname<\/b>:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>VonObenNachUnten()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Debug.Print<\/span> objDocument.selectSingleNode( _\n         \"Bestellverwaltung\/Kategorie\/Artikel\/Artikelname\"). nodeTypedValue\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<h2>Alle direkt untergeordneten Elemente<\/h2>\n<p>Alle untergeordneten Elemente etwa der <b>Kategorie<\/b>-Elemente erhalten Sie, indem Sie vom <b>DOMDocument<\/b>-Element den Ausdruck <b>Bestellverwaltung\/Kategorie\/* <\/b>mit der Methode <b>selectNodes <\/b>nutzen. Die folgende Prozedur gibt die Namen aller den <b>Kategorie<\/b>-Elementen untergeordneten Elemente aus, also zum Beispiel <b>Kategoriename<\/b>, <b>Beschreibung <\/b>und <b>Artikel<\/b>:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>AlleUntergeordneten()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objKinder<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objKind<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objKinder = objDocument. selectNodes(\"Bestellverwaltung\/Kategorie\/*\")\n     For Each objKind In objKinder\n         <span style=\"color: blue;\">Debug.Print<\/span> objKind.baseName\n     <span style=\"color: blue;\">Next<\/span> objKind\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Das k\u00f6nnte man auf naive Weise und ohne Kenntnis der XPath-Syntax auch umst\u00e4ndlicher machen &#8211; zum Beispiel wie folgt:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>AlleUntergeordneten_Naiv()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objBestellverwaltung<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objKategorien<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objKategorie<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objKinder<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objKind<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objBestellverwaltung =  objDocument.selectSingleNode(\"Bestellverwaltung\")\n     <span style=\"color: blue;\">Set<\/span> objKategorien =  objBestellverwaltung.selectNodes(\"Kategorie\")\n     For Each objKategorie In objKategorien\n         <span style=\"color: blue;\">Set<\/span> objKinder = objKategorie.selectNodes(\"*\")\n         For Each objKind In objKinder\n             <span style=\"color: blue;\">Debug.Print<\/span> objKind.baseName\n         <span style=\"color: blue;\">Next<\/span> objKind\n     <span style=\"color: blue;\">Next<\/span> objKategorie\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<h2>Bestimmte Elemente mit VBA XPath ermitteln<\/h2>\n<p>Elemente zeichnen sich entweder durch den Inhalt aus oder durch den Wert ihrer Attribute. Fr\u00fcher oder sp\u00e4ter werden Sie XML-Dokumente nach Elementen mit solchen Eigenschaften durchforsten m\u00fcssen.<\/p>\n<h2>Kategorie-Element mit bestimmtem Namen<\/h2>\n<p>Wenn Sie ein Element mit einem bestimmten atomaren Wert suchen (ein atomarer Wert ist ein Wert, der keine weiteren untergeordneten Elemente aufweist), k\u00f6nnen Sie die Syntax mit einem Suchausdruck in eckigen Klammern gleich hinter dem Elementnamen nutzen. Wenn Sie etwa die Kategorie mit dem Wert <b>Getr\u00e4nke <\/b>im Element <b>Kategorienamen <\/b>suchen, sieht das wie folgt aus &#8211; hier geben wir den XML-Inhalt des gefundenen Objekts aus:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>KategorieMitBestimmtemNamen()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objKategorie<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objKategorie = objDocument.selectSingleNode( \"\/\/Kategorie[Kategoriename=''''Getr\u00e4nke']\")\n     <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> objKategorie Is Nothing<span style=\"color: blue;\"> Then<\/span>\n         <span style=\"color: blue;\">Debug.Print<\/span> objKategorie.XML\n     <span style=\"color: blue;\">End If<\/span>\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Vor dem Suchausdruck befindet sich also der Name des Elements, der Suchausdruck landet in eckigen Klammern und lautet etwa <b>Kategoriename=&#8220;&#8220;Getr\u00e4nke&#8220;&#8220;<\/b>. Die Ausgabe des Ergebnisses haben wir diesmal in eine Pr\u00fcfung eingefasst, ob die Suche \u00fcberhaupt erfolgreich war und <b>objKategorie <\/b>nicht gegebenenfalls noch leer ist, was beim Zugriff einen Fehler ausl\u00f6sen w\u00fcrde.<\/p>\n<h2>Alle Artikelnamen einer bestimmten Kategorie<\/h2>\n<p>Wenn Sie nun alle Artikelnamen dieser Kategorie ausgeben m\u00f6chten, brauchen Sie keine weiteren Objekte zu erstellen, die Sie nach dem Herausfinden der Kategorie mit einem weiteren XPath-Ausdruck ermitteln und dann durchlaufen. Eine Liste aller Artikelnamen einer bestimmten Kategorie, beispielsweise der Kategorie <b>Getr\u00e4nke<\/b>, finden Sie auch mit diesem Ausdruck (s. Listing 3):<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>ArtikelEinerKategorie()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objArtikelnamen<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objArtikelname<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objArtikelnamen = _\n         objDocument.selectNodes(\"\/\/Kategorie[Kategoriename=''''Getr\u00e4nke']\/Artikel\/Artikelname\")\n     For Each objArtikelname In objArtikelnamen\n         <span style=\"color: blue;\">Debug.Print<\/span> objArtikelname.nodeTypedValue\n     <span style=\"color: blue;\">Next<\/span> objArtikelname\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 3: Einlesen aller Artikelnamen der Artikel einer bestimmten Kategorie<\/span><\/b><\/p>\n<pre>\/\/Kategorie[Kategoriename=''''Getr\u00e4nke']\/Artikel\/Artikelname<\/pre>\n<p>Haben Sie etwas bemerkt Sie brauchen prinzipiell immer nur eine einzige <b>selectNodes<\/b>&#8211; oder <b>selectSingleNode<\/b>-Funktion zu nutzen, um direkt auf die Werte des gesuchten Elements zugreifen zu k\u00f6nnen, weil Sie immer so weit navigieren k\u00f6nnen, wie es der Anwendungsfall erfordert.<\/p>\n<h2>Artikeleigenschaften eines bestimmten Artikels ausgeben<\/h2>\n<p>Manchmal brauchen Sie dennoch mehrere Aufrufe von <b>selectNodes <\/b>oder <b>selectSingleNode<\/b> &#8211; so etwa, wenn Sie mehrere Unterelemente eines Elements auswerten m\u00fcssen. Ein <b>Artikel<\/b>-Element hat ja beispielsweise die Unterelemente <b>Artikelname <\/b>und <b>Einzelpreis<\/b>, die vermutlich auch einmal gemeinsam abgefragt werden m\u00fcssen.<\/p>\n<p>In diesem Fall durchlaufen Sie dann eben alle <b>Artikel<\/b>-Elemente der gew\u00fcnschten Kategorie und greifen dann in der Schleife \u00fcber alle Elemente auf die beiden Unterelemente <b>Artikelname <\/b>und <b>Einzelpreis <\/b>zu und geben diese aus:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>UnterelementeArtikelEinerKategorie()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objArtikelliste<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Dim <\/span>objArtikel<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objArtikelliste = objDocument.selectNodes( \"\/\/Kategorie[Kategoriename=''''Getr\u00e4nke']\/Artikel\")\n     For Each objArtikel In objArtikelliste\n         <span style=\"color: blue;\">Debug.Print<\/span> objArtikel.selectSingleNode( \"Artikelname\").nodeTypedValue\n         <span style=\"color: blue;\">Debug.Print<\/span> objArtikel.selectSingleNode( \"Einzelpreis\").nodeTypedValue\n     <span style=\"color: blue;\">Next<\/span> objArtikel\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<h2>Weitere Vergleichsausdr\u00fccke mit VBA XPath<\/h2>\n<p>Einen einfachen Vergleichsausdruck haben Sie ja schon kennen gelernt &#8211; <b>Kategoriename = &#8220;&#8220;Getr\u00e4nke&#8220;&#8220;<\/b>.<\/p>\n<p>Es gibt noch eine Reihe weiterer Ausdr\u00fccke, die sich oft von den von uns gewohnten Ausdr\u00fccken etwa von SQL unterscheiden.<\/p>\n<p>Wenn Sie etwa nur solche Elemente ermitteln wollen, deren Wert mit einem bestimmten Buchstaben beginnt, w\u00fcrden Sie unter Access-SQL einfach den Ausdruck <b>Kategoriename LIKE &#8220;&#8220;G*&#8220;&#8220; <\/b>nutzen. Unter XPath nutzen Sie hingegen eine Funktion namens <b>starts-with<\/b>.<\/p>\n<p>Achtung: F\u00fcr die Verwendung der nachfolgend beschriebenen Ausdr\u00fccke ben\u00f6tigen Sie unbedingt die Abfrage-sprache XPath und nicht XSLPattern. Diese ist f\u00fcr <b>Microsoft XML, v6.0 <\/b>voreingestellt.<\/p>\n<p>F\u00fcr <b>Microsoft XML, v3.0 <\/b>m\u00fcssen Sie diese noch einstellen, und zwar mit folgender Anweisung:<\/p>\n<pre>objDocument.SetProperty \"SelectionLanguage\", \"XPath\"<\/pre>\n<p>Weitere Informationen hierzu finden Sie im Beitrag <b>XML-Zugriff per VBA: Welche Version <\/b>(<b>www.access-im-unternehmen.de\/1049<\/b>).<\/p>\n<p>Gegebenenfalls finden Sie keine Elemente mehr, sobald Sie <b>Microsoft XML, v3.0<\/b> mit XPath statt XSLPattern oder direkt <b>Microsoft XML, v6.0 <\/b>verwenden. Was in diesem Fall zu tun ist, lesen Sie weiter unten unter <b>Das leidige Namespace-Thema<\/b>.<\/p>\n<h2>Elemente, deren Wert mit einer bestimmten Zeichenkette beginnt<\/h2>\n<p>Den Einsatz der <b>starts-with<\/b>-Funktion veranschaulicht das folgende Beispiel:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>AlleKategorienMitG()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objElement<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode( \"\/\/Kategorie[starts-with(Kategoriename,''''G'''')]\")\n     <span style=\"color: blue;\">Debug.Print<\/span> objElement.XML\n     ''''... weitere Beispiele\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Hier suchen wir nach dem ersten <b>Kategorie<\/b>-Element, dessen untergeordnetes Element <b>Kategoriename <\/b>mit dem Buchstaben <b>G <\/b>beginnt, und geben den XML-Inhalt aus. Die folgenden Beispiele k\u00f6nnen Sie einfach in obiges Listing einf\u00fcgen und ausprobieren.<\/p>\n<p>Wenn Sie nur das erste <b>Kategoriename<\/b>-Element suchen, dessen Wert mit <b>G <\/b>beginnt, referenzieren Sie zun\u00e4cht das <b>Kategoriename<\/b>-Element und geben als ersten Parameter der <b>starts-with<\/b>-Funktion den Punkt an &#8211; dies entspricht dann dem gleichen Element:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode(\"\/\/Kategoriename[starts-with(.,''''G'''')]\")<\/pre>\n<h2>Elemente, die eine bestimmte Zeichenkette enthalten<\/h2>\n<p>Wenn Sie alle Elemente, hier Kategorien, finden wollen, deren Kategoriename eine bestimmte Zeichenkette enth\u00e4lt, verwenden Sie eine Suche wie die Folgende:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>AlleKategorienDieEinAEnthalten()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objElement<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>objElemente<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMSelection\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objElemente = objDocument.selectNodes( \"\/\/Kategorie\/Kategoriename[contains(., ''''a'''')]\")\n     For Each objElement In objElemente\n         <span style=\"color: blue;\">Debug.Print<\/span> objElement.XML\n     <span style=\"color: blue;\">Next<\/span> objElement\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Achtung: Hier werden Gro\u00df- und Kleinschreibung unterschieden.<\/p>\n<h2>Weitere Funktionen von VBA XPath<\/h2>\n<p>Wir k\u00f6nnten hier noch seitenweise \u00fcber diese Funktionen berichten, aber das w\u00fcrde den Rahmen sprengen. Eine \u00dcbersicht aller Funktionen finden Sie direkt bei W3C unter folgendem Link:<\/p>\n<pre>https:\/\/www.w3.org\/TR\/xpath-functions\/<\/pre>\n<h2>Das leidige Namespace-Thema<\/h2>\n<p>Wenn Sie VBA XPath statt XSLPattern nutzen, bekommen Sie m\u00f6glicherweise ein Problem mit Namespaces. Dies k\u00f6nnen Sie mit unserer Datei <b>KategorienUndArtikel_MitNS.xml<\/b> reproduzieren, die folgenden Namespace deklariert:<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\n&lt;Bestellverwaltung xmlns=\"http:\/\/www.w3.org\/TR\/REC-html40\"&gt;\n...<\/pre>\n<p>Nutzen Sie nun als Abfragesprache XPath und nicht XSLPattern, erhalten Sie keine Suchergebnisse, auf welches Element Sie auch immer mit einer Abfrage wie der folgenden zugreifen. Hier verwenden wir Microsoft XML, v3.0 und stellen die Abfragesprache mit dem Parameter <b>SelectionLanguage <\/b>nachtr\u00e4glich auf XPath um.<\/p>\n<p>Die letzte Zeile, die einfach nur den XML-Inhalt des Root-Elements liefern soll, l\u00f6st einen Fehler aus, weil <b>selectSingleNode <\/b>kein Ergebnis lieferte und der Zugriff auf <b>objElement <\/b>so fehlschl\u00e4gt:<\/p>\n<pre><span style=\"color: blue;\">Public Function <\/span>TestXPathMitNS()<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objElement<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMElement\n     <span style=\"color: blue;\">Dim <\/span>strDatei<span style=\"color: blue;\"> As String<\/span>\n     strDatei = CurrentProject.Path  &amp; \"KategorienUndArtikel_MitNS.xml\"\n     <span style=\"color: blue;\">Set<\/span> objDocument = <span style=\"color: blue;\">New<\/span> MSXML2.DOMDocument\n     objDocument.SetProperty \"SelectionLanguage\", \"XPath\"\n     objDocument.Load strDatei\n     <span style=\"color: blue;\">Set<\/span> objElement =  objDocument.selectSingleNode(\"Bestellverwaltung\")\n     <span style=\"color: blue;\">Debug.Print<\/span> objElement.XML\n<span style=\"color: blue;\">End Function<\/span><\/pre>\n<p>In diesem Fall sind zwei Schritte n\u00f6tig:<\/p>\n<p>Sie stellen einen weiteren Parameter namens <b>SelectionNamespaces <\/b>ein, und zwar auf den im Root-Element angegebenen Namespace:<\/p>\n<pre>objDocument.SetProperty \"SelectionNamespaces\", \"xmlns:ns=''''http:\/\/www.w3.org\/TR\/REC-html40''''\"<\/pre>\n<p>Der Ausdruck<\/p>\n<pre>xmlns:ns=''''http:\/\/www.w3.org\/TR\/REC-html40''''<\/pre>\n<p>sieht nun etwas anders aus als der Namespace aus dem XML-Dokument:<\/p>\n<pre>xmlns=\"http:\/\/www.w3.org\/TR\/REC-html40\"<\/pre>\n<p>Das liegt daran, dass hier kein Pr\u00e4fix vorliegt, das wir mit <b>:ns <\/b>an <b>xmlns<\/b> anf\u00fcgen.<\/p>\n<p>Au\u00dferdem verwenden wir einfache Anf\u00fchrungszeichen, da der Namespace selbst ja als Parameterwert in Anf\u00fchrungszeichen angegeben werden muss.<\/p>\n<p>Der zweite Schritt ist ja nach der Anzahl der Aufrufe von <b>selectNodes <\/b>oder <b>selectSingleNode <\/b>aufwendiger. Sie m\u00fcssen nun n\u00e4mlich jedem Bezug auf ein Element des XML-Dokuments das Pr\u00e4fix <b>ns: <\/b>voranstellen. In unserem Fall lautet die Abfrage also nun wie folgt:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement =  objDocument.selectSingleNode(\"ns:Bestellverwaltung\")<\/pre>\n<p>Wenn Sie etwa die <b>starts-with<\/b>-Funktion nutzen, s\u00e4he es so aus:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode( _\n    \"\/\/ns:Artikel[starts-with(ns:Artikelname,''''C'''')]\")<\/pre>\n<p>Hier m\u00fcssen Sie also gleich zwei Mal das Namespace-Pr\u00e4fix angeben.<\/p>\n<h2>Element mit VBA XPath an einer bestimmten Position finden<\/h2>\n<p>Manchmal m\u00f6chten Sie in einer Liste von Elementen nur ein bestimmtes Element verwenden &#8211; eines, das sich an einer bestimmten Position befindet. Dazu k\u00f6nnen Sie den Index des Elements angeben.<\/p>\n<p>Wenn Sie beispielsweise nur das dritte Kategorie-Element suchen, gelingt das so:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement =  objDocument.selectSingleNode(\"\/\/Kategorie\")<\/pre>\n<p>Dies liefert das dritte Kategorie-Element. Aber Vorsicht: Dies geschieht nur, wenn Sie XSLPattern als Abfragesprache verwenden, und nicht XPath! Der Index bei XPath ist <b>0<\/b>-basierend, bei XSLPattern <b>1<\/b>-basierend.<\/p>\n<p>Wenn Sie also bei XPath auf das dritte Element zugreifen wollen, ben\u00f6tigen Sie etwa folgende Anweisung:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement =  objDocument.selectSingleNode(\"\/\/Kategorie\")<\/pre>\n<p>Zur Erinnerung: XSLPattern ist die Standardabfragesprache unter <b>Microsoft XML, v3.0<\/b>. Sie k\u00f6nnen diese dort mit der Option <b>SelectionLanguage <\/b>auf <b>XPath <\/b>einstellen.<\/p>\n<p>Oder Sie verwenden <b>Microsoft XML, v6.0<\/b>, wo XPath automatisch voreingestellt ist.<\/p>\n<h2>Letztes Element<\/h2>\n<p>Wenn Sie den Index nicht kennen, aber dennoch auf das letzte Element seiner Art zugreifen wollen, k\u00f6nnen Sie die <b>last()<\/b>-Funktion als Suchkriterium nutzen:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode( \"\/\/Kategorie[last()]\")\n<span style=\"color: blue;\">Debug.Print<\/span> objElement. selectSingleNode(\"Kategoriename\").nodeTypedValue<\/pre>\n<h2>Wert eines Attributs ausgeben<\/h2>\n<p>Wenn Sie ein Element mit einem Attribut referenziert haben, k\u00f6nnen Sie auch den Wert des Attributs ausgeben. Dazu nutzen Sie dann die Auflistung <b>attributes <\/b>des Elements, das eine Eigenschaft namens <b>getNamedItem <\/b>liefert. Dieser Eigenschaft \u00fcbergeben Sie dann den Namen des gesuchten Attributs.<\/p>\n<p>Angenommen, <b>objElement <\/b>enth\u00e4lt ein <b>Kategorie<\/b>-Element. Dann k\u00f6nnen Sie mit folgender Anweisung auf den Wert des <b>KategorieID<\/b>-Attributs zugreifen:<\/p>\n<pre><span style=\"color: blue;\">Debug.Print<\/span> objElement.Attributes. getNamedItem(\"KategorieID\").nodeTypedValue<\/pre>\n<h2>Ein Attribut mit XPath abfragen<\/h2>\n<p>Unsere <b>Kategorie<\/b>&#8211; und <b>Artikel<\/b>-Elemente haben ja jeweils das Attribut <b>KategorieID <\/b>beziehungsweise <b>ArtikelID<\/b>. Wenn Sie das Attribut eines Elements abfragen wollen, gelingt dies so:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>AttributAbfragen()\n     <span style=\"color: blue;\">Dim <\/span>objDocument<span style=\"color: blue;\"> As <\/span>MSXML2.DOMDocument\n     <span style=\"color: blue;\">Dim <\/span>objAttribut<span style=\"color: blue;\"> As <\/span>MSXML2.IXMLDOMAttribute\n     <span style=\"color: blue;\">Set<\/span> objDocument = GetDocument\n     <span style=\"color: blue;\">Set<\/span> objAttribut = objDocument.selectSingleNode( \"\/\/Kategorie\/@KategorieID\")\n     <span style=\"color: blue;\">Debug.Print<\/span> objAttribut.nodeTypedValue\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p>Hier sind zwei Dinge zu beachten: Erstens haben wir ein Objekt des Typs <b>IXMLDOMAttribut <\/b>definiert, und zweitens fragen wir dieses mit dem vorangestellten <b>@<\/b>-Zeichen wie ein herk\u00f6mmliches Element ab.<\/p>\n<h2>Element nach Attributwert suchen<\/h2>\n<p>Damit ist die Suche nach einem Element mit einem bestimmten Attributwert nicht weit. Eine solche Suche erledigen Sie, indem Sie hinter dem Namen des Elements mit dem Attribut einen Vergleichsausdruck wie <b>@Kategorie=4 <\/b>in eckige Klammern setzen:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElement = objDocument.selectSingleNode( \"\/\/Kategorie[@KategorieID=4]\")\n<span style=\"color: blue;\">Debug.Print<\/span> objElement.Attributes. getNamedItem(\"KategorieID\").nodeTypedValue<\/pre>\n<p>Die zweite Anweisung gibt den Wert des Attributs erneut aus.<\/p>\n<h2>Elemente, die ein bestimmtes Unterelement enthalten<\/h2>\n<p>Wenn Sie einmal nach Elementen suchen, die ein bestimmtes Unterelement aufweisen, gelingt dies, indem Sie einfach das gesuchte Unterelement hinter dem gesuchten Element in eckigen Klammern angeben:<\/p>\n<pre><span style=\"color: blue;\">Set<\/span> objElemente = objDocument.selectNodes( \"\/\/Kategorie[Artikel]\")\nFor Each objElement In objElemente\n     <span style=\"color: blue;\">Debug.Print<\/span> objElement.selectSingleNode( \"Kategoriename\").nodeTypedValue\n<span style=\"color: blue;\">Next<\/span> objElement<\/pre>\n<p>So k\u00f6nnen Sie beispielsweise leere Kategorien direkt von einem Einlesevorgang ausklammern.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>XPath ist eine m\u00e4chtige Abfragesprache f\u00fcr den Zugriff auf XML-Elemente. Wenn Sie ein wenig Erfahrung gesammelt haben, k\u00f6nnen Sie damit schnell und direkt auf die gesuchten Informationen zugreifen. Der Lernprozess ist dabei etwa wie bei DAO\/SQL: Zu Beginn formuliert man weniger SQL-Abfragen und arbeitet eher mit VBA\/DAO, um etwa Daten in einer Reihe von Datens\u00e4tzen zu \u00e4ndern. Sp\u00e4ter formuliert man direkt eine SQL-Anweisung, die dann gegebenenfalls nur noch parametrisiert wird.<\/p>\n<p>Bei VBA, DOM und XPath ist es \u00e4hnlich: Sie k\u00f6nnen nat\u00fcrlich erst alle Kategorie-Elemente ermitteln, diese in einer Schleife durchlaufen, darin die Artikel-Elemente referenzieren und durchlaufen und dann darin enthaltene Daten einlesen. Sie k\u00f6nnen aber auch direkt den XPath-Ausdruck formulieren, der Ihnen die gew\u00fcnschten Informationen liefert.<\/p>\n<p>Ich hoffe, dieser Artikel liefert einige Anregungen, damit Sie XPath sinnvoll in Ihren Programmieralltag einbauen k\u00f6nnen &#8211; zumindest, wenn Sie auf XML-Dokumente zugreifen wollen.<\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>XPath.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/296DD6FF-D355-48EF-A316-918D7112F384\/aiu_1050.zip\">Download<\/a><\/p>\n<h2>Weitere interessante Artikel zu diesem Thema<\/h2>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/266'>Daten im XML-Format exportieren und weiterverarbeiten<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/318'>XML mit Access, Teil 1<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/332'>XML mit Access, Teil 2<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/355'>XML mit Access, Teil 3<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/522'>XML-Dokumente mit VBA erstellen und lesen<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/969'>XML-Dokumente mit SAX parsen<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/1045'>XML-Export ohne VBA<\/a><\/p>\n<p><a href='https:\/\/www.access-im-unternehmen.de\/1047'>XML-Dokumente transformieren mit XSLT<\/a><\/p>\n<p><!--LinksEnde--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>XML-Dokumente erscheinen je nach Gr&ouml;&szlig;e auf den ersten Blick oft un&uuml;bersichtlich und m&auml;chtig. Wie soll man hier die gew&uuml;nschten Daten extrahieren &#8211; und das auch noch programmgesteuert per VBA Beispielsweise, um Informationen aus einem XML-Dokument in eine Access-Tabelle zu &uuml;bertragen Daf&uuml;r steht die Abfragesprache XPath zur Verf&uuml;gung. Sie erlaubt es, mit verschiedenen Ausdrucken gezielt auf Elemente mit bestimmten Namen oder Eigenschaften zuzugreifen. Dieser Beitrag zeigt anhand einiger Beispiele, wie Sie XPath unter Access\/VBA einsetzen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662016,66042016,44000025],"tags":[],"class_list":["post-55001050","post","type-post","status-publish","format-standard","hentry","category-662016","category-66042016","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>MIt VBA XPath gezielt auf die Daten in XML-Dokumente zugreifen<\/title>\n<meta name=\"description\" content=\"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XML-Zugriff per VBA XPath\" \/>\n<meta property=\"og:description\" content=\"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T16:34:05+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"XML-Zugriff per VBA XPath\",\"datePublished\":\"2021-03-22T16:34:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/\"},\"wordCount\":2860,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2016\",\"4\\\/2016\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/\",\"name\":\"MIt VBA XPath gezielt auf die Daten in XML-Dokumente zugreifen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2021-03-22T16:34:05+00:00\",\"description\":\"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLZugriff_per_VBA_XPath\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XML-Zugriff per VBA XPath\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MIt VBA XPath gezielt auf die Daten in XML-Dokumente zugreifen","description":"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/","og_locale":"de_DE","og_type":"article","og_title":"XML-Zugriff per VBA XPath","og_description":"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.","og_url":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-03-22T16:34:05+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"XML-Zugriff per VBA XPath","datePublished":"2021-03-22T16:34:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/"},"wordCount":2860,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2016","4\/2016","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/","url":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/","name":"MIt VBA XPath gezielt auf die Daten in XML-Dokumente zugreifen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2021-03-22T16:34:05+00:00","description":"Mit der VBA XPath-Abfragesprache k\u00f6nnen Sie gezielt auf die Elemente von XML-Dokumenten zugreifen und diese referenzieren oder durchlaufen.","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/XMLZugriff_per_VBA_XPath\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"XML-Zugriff per VBA XPath"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001050"}],"version-history":[{"count":7,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001050\/revisions"}],"predecessor-version":[{"id":88072474,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001050\/revisions\/88072474"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}