{"id":55000969,"date":"2015-02-01T00:00:00","date_gmt":"2020-05-22T21:06:49","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=969"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XMLDokumente_mit_SAX_parsen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/","title":{"rendered":"XML-Dokumente mit SAX parsen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wir haben uns bereits in vielen Beitr&auml;gen mit dem Parsen von XML-Dokumenten befasst. Dabei haben wir immer den DOM-Parser verwendet, um die im XML-Dokument enthaltenen Daten zu lesen. In diesem Beitrag schauen wir uns eine Alternative namens SAX an. W&auml;hrend DOM das komplette XML-Dokument in den Speicher liest und darauf zugreift, liest SAX das Dokument zeilenweise ein. Im Folgenden erfahren Sie, welche Vor- und Nachteile die beiden Methoden haben und wie Sie mit SAX arbeiten k&ouml;nnen.<\/b><\/p>\n<p>Der DOM-Parser liest ein vollst&auml;ndiges XML-Dokument in den Speicher ein und kann daf&uuml;r auf alle enthaltenen Elemente zugreifen. Sie k&ouml;nnen die Elemente damit nacheinander durchlaufen oder mithilfe von <b>XPATH<\/b>-Ausdr&uuml;cken und Methoden wie <b>SelectSingleNode <\/b>oder <b>SelectNodes <\/b>nach bestimmten Elementen im Dokumentbaum suchen. <\/p>\n<p>Sie k&ouml;nnen damit im Dokumentbaum vor- und zur&uuml;ckspringen oder die enthaltenen Elemente hierarchisch durchlaufen.<\/p>\n<p><b>DOM: Vor- und Nachteile<\/b><\/p>\n<p>Der Nachteil liegt auf der Hand: Da der komplette Baum im Speicher liegt und mitunter verschachtelt ist, kann der Zugriff auf die Inhalte recht schnell zu Lasten der Performance gehen.<\/p>\n<p>Ein weiterer Nachteil ist, dass sehr gro&szlig;e XML-Dateien m&ouml;glicherweise nicht in den Speicher passen und somit nicht geladen werden k&ouml;nnen. Daf&uuml;r k&ouml;nnen Sie mit DOM aber nicht nur gezielt auf einzelne Elemente zugreifen, sondern den Dokumentbaum und die Inhalte auch bearbeiten.<\/p>\n<p><b>SAX: Schnell, aber unflexibel<\/b><\/p>\n<p>Anders sieht es bei SAX aus. Der SAX-Parser liest das Dokument Zeile f&uuml;r Zeile ein und bietet die M&ouml;glichkeit, auf die jeweilige Zeile zuzugreifen. Dabei ist der SAX-Parser rasend schnell! Allerdings liest er auch nur in einer Richtung, ein Hin- und Herspringen oder gar das gezielte Einlesen eines einzelnen Elements ohne Durchlaufen des XML-Dokuments bis zu diesem Punkt ist nicht m&ouml;glich.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen Sie mit dem SAX-Parser keine &auml;nderungen am XML-Dokument vornehmen.<\/p>\n<p><b>Vorbereitungen<\/b><\/p>\n<p>Um den SAX-Parser nutzen zu k&ouml;nnen, ben&ouml;tigen Sie einen Verweis auf die Objektbibliothek <b>Microsoft XML v6.0 <\/b>(s. Bild 1).<\/p>\n<p class=\"image\"><img loading=\"lazy\" decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_001.png\" alt=\"Setzen eines Verweises auf die Bibliothek Microsoft XML, v6.0\" width=\"450\" height=\"350\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Setzen eines Verweises auf die Bibliothek Microsoft XML, v6.0<\/span><\/b><\/p>\n<p><b>Funktionsweise des SAX-Parsers<\/b><\/p>\n<p>Wie aber greift der SAX-Parser nun auf das XML-Dokument zu &ouml;ffnet er es wie ein Textdokument und liest dann etwa in einer Schleife die einzelnen Zeilen in eine Variable ein, auf deren Inhalt wir dann per VBA zugreifen k&ouml;nnen<\/p>\n<p>Mitnichten: Der SAX-Parser basiert auf Ereignissen. Das hei&szlig;t, dass es verschiedene Ereignisse gibt:<\/p>\n<ul>\n<li><b>documentLocator(ByVal RHS As MSXML2.IVBSAXLocator)<\/b>: Liefert Informationen etwa &uuml;ber den Speicherort des Dokuments.<\/li>\n<li><b>startDocument()<\/b>: Wird zu Beginn des Einlesevorgangs ausgel&ouml;st.<\/li>\n<li><b>startPrefixMapping(strPrefix As String, strURI As String)<\/b>: Wird beim Einlesen der Namespace-Informationen ausgel&ouml;st und liefert mit <b>strPrefix <\/b>das K&uuml;rzel f&uuml;r den <b>NameSpace <\/b>(zum Beispiel <b>xsi <\/b>oder <b>xsd<\/b>) und mit <b>strURI <\/b>die jeweilige <b>URI<\/b>.<\/li>\n<li><b>startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)<\/b>: Wird f&uuml;r den Start eines jeden Elements ausgel&ouml;st (also etwa f&uuml;r <b><Vorname><\/b>) und liefert mit <b>strNameSpaceURI<\/b> den Namespace, mit <b>strLocalName <\/b>den Namen des Elements und mit <b>oAttributes <\/b>ein Element, mit dem sich die Attribute des Elements auslesen lassen.<\/li>\n<li><b>characters(strChars As String)<\/b>: Wird beim Einlesen eines Teils des Inhalts ausgel&ouml;st und liefert mit <b>strChars <\/b>den Inhalt. Dabei werden immer alle Zeichen geliefert, also auch die Zeilenumbr&uuml;che zwischen zwei Elementen, die Einr&uuml;ckungen und nat&uuml;rlich auch die tats&auml;chlichen Inhalte der Elemente.<\/li>\n<li><b>endElement(strName-spaceURI As String, strLocalName As String, strQName As String)<\/b>: <b>endElement <\/b>wird ausgel&ouml;st, wenn das Ende des Elements erreicht wird, also etwa <b><\/Vorname><\/b>. Die Parameter liefern die bereits weiter oben beschriebenen Werte.<\/li>\n<li><b>endPrefix-Map-ping(str-Prefix As String)<\/b>: Wird ausgel&ouml;st, wenn das schlie&szlig;ende Element zu dem Element erreicht wird, das eine Namespace-Angabe enthielt.<\/li>\n<li><b>endDocument()<\/b>: Wird nach der Abarbeitung des letzten Elements ausgel&ouml;st.<\/li>\n<\/ul>\n<p>Die &uuml;brigen Ereignisse ben&ouml;tigen wir f&uuml;r die Beispiele dieses Beitrags nicht.<\/p>\n<p><b>Ereignisse implementieren<\/b><\/p>\n<p>Wie implementieren wir diese Ereignisse nun Als Erstes erstellen Sie ein neues Klassenmodul namens <b>clsSAX<\/b>. Normalerweise w&uuml;rde man diesem nun eine entsprechende Objektvariable hinzuf&uuml;gen, die mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert wird und so die enthaltenen Ereignisprozeduren verf&uuml;gbar macht.<\/p>\n<p>In diesem Fall ist dies anders: Wir deklarieren keine Objektvariable, sondern legen mit der <b>Implements<\/b>-Anweisung fest, dass die Klasse alle Ereignisprozeduren eines speziellen Interfaces implementiert &#8211; in diesem Falle f&uuml;r das Interface <b>MSXML2.IVBSAXContentHandler<\/b> (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_002.png\" alt=\"Implementieren der Klasse IVBSAXContentHandler\" width=\"650\" height=\"235,2033\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Implementieren der Klasse IVBSAXContentHandler<\/span><\/b><\/p>\n<p>Dessen Ereignisse k&ouml;nnen Sie dann jedoch genau wie bei mit <b>WithEvents<\/b> deklarierten Objekten mit den beiden Kombinationsfeldern im oberen Bereich des Codefensters festlegen. Als Erstes f&uuml;gen wir so das Ereignis <b>startDocument <\/b>hinzu (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_003.png\" alt=\"Implementieren eines Ereignisses der Klasse IVBSAXContentHandler\" width=\"700\" height=\"308,8235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Implementieren eines Ereignisses der Klasse IVBSAXContentHandler<\/span><\/b><\/p>\n<p>Im Gegensatz zu mit Objekten, die Ereignisse ausl&ouml;sen, m&uuml;ssen Sie jedoch bei der Implementierung eines Interfaces alle Elemente anlegen. Anderenfalls l&ouml;st das Debuggen des VBA-Projekts den Fehler aus Bild 4 aus. Wenn Sie alle Ereignisprozeduren hinzugef&uuml;gt haben, ist der erste Teil erledigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_004.png\" alt=\"Die Implementierung der Klasse IVBSAXContentHandler ist noch nicht vollst&auml;ndig.\" width=\"700\" height=\"308,8235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Implementierung der Klasse IVBSAXContentHandler ist noch nicht vollst&auml;ndig.<\/span><\/b><\/p>\n<p>Nun liegt uns allerdings zun&auml;chst einmal eine Klasse vor, die allein noch nichts ausrichtet. Wir m&uuml;ssen zun&auml;chst ein Objekt auf Basis dieser Klasse deklarieren und instanzieren sowie der Klasse mitteilen, dass sie in Aktion treten soll.<\/p>\n<p>Dies erledigen wir gleich einmal in einem Formular, das auch die Steuerelemente zum Ausw&auml;hlen der zu untersuchenden XML-Datei sowie eine Schaltfl&auml;che zum Starten des Vorgangs enthalten soll. Dieses Formular sieht im ersten Entwurf wie in Bild 5 aus. Die Schaltfl&auml;che <b>Einlesen <\/b>soll das angegebene XML-Dokument mithilfe der Klasse <b>clsSAX <\/b>einlesen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_005.png\" alt=\"Das Formular frmSAX\" width=\"450\" height=\"139,7666\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Formular frmSAX<\/span><\/b><\/p>\n<p>Dazu legen Sie die Ereignisprozedur aus Listing 1 an. Die Prozedur deklariert gleich zwei Objektvariablen: <b>objSax <\/b>soll ein Objekt auf Basis der soeben erstellten Klasse <b>clsSAX <\/b>aufnehmen. <b>objReader <\/b>nimmt ein Objekt des Typs <b>SAXXMLReader60 <\/b>auf, das Teil der Objektbibliothek <b>Microsoft XML, v6.0 <\/b>ist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEinlesen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objReader<span style=\"color:blue;\"> As <\/span>SAXXMLReader60\r\n     <span style=\"color:blue;\">Dim <\/span>objSax<span style=\"color:blue;\"> As <\/span>clsSAX\r\n     <span style=\"color:blue;\">Set<\/span> objReader = <span style=\"color:blue;\">New<\/span> SAXXMLReader60\r\n     <span style=\"color:blue;\">Set<\/span> objSax = <span style=\"color:blue;\">New<\/span> clsSAX\r\n     <span style=\"color:blue;\">Set<\/span> objReader.contentHandler = objSax\r\n     objReader.parseURL Me!txtDatei\r\n     <span style=\"color:blue;\">Set<\/span> objReader = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur startet den Einlesevorgang.<\/span><\/b><\/p>\n<p>Nun weisen Sie der Eigenschaft <b>contentHandler <\/b>der Klasse <b>objReader <\/b>den Verweis auf das Objekt <b>objSax <\/b>zu und rufen dann die Methode <b>parseURL <\/b>der Klasse <b>objReader <\/b>mit der einzulesenden Datei als Parameter auf. Das war der Rahmen &#8211; mit einem Klick auf die Schaltfl&auml;che <b>cmdEinlesen <\/b>starten Sie nun den Einlesevorgang, der die Ereignisse der Klasse <b>clsSAX <\/b>ausl&ouml;st.<\/p>\n<p>Dabei geschieht aber offensichtlich noch gar nichts &#8211; was aber auch kein Wunder ist: Immerhin haben wir den Ereignisprozeduren ja auch noch keine einzige Zeile Code hinzugef&uuml;gt.<\/p>\n<p><b>Einlesevorgang programmieren<\/b><\/p>\n<p>Dies gehen wir im folgenden Schritt an. Wir wollen zun&auml;chst einmal erfahren, welche Informationen der Parser zu den einzelnen Elementen liefert &#8211; und zwar am Beispiel einer einfachen XML-Datei wie der aus Listing 2.<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"utf-8\"&gt;\r\n&lt;Kunden xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" \r\n                    xmlns:xsd=\"http:\/\/www.w3.org\/2001\/XMLSchema\"&gt;\r\n   &lt;Kunde KundeID=\"123\"&gt;\r\n     &lt;Vorname&gt;Andr&eacute;&lt;\/Vorname&gt;\r\n     &lt;Nachname&gt;Minhorst&lt;\/Nachname&gt;\r\n   &lt;\/Kunde&gt;\r\n&lt;\/Kunden&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Einfache Beispiel-XML-Datei<\/span><\/b><\/p>\n<p>Dazu f&uuml;gen wir den Ereignisprozeduren der Klasse <b>clsSAX <\/b>einige <b>Debug.Print<\/b>-Anweisungen hinzu, die erstens den Namen des jeweiligen Ereignisses enthalten und zweitens die mit den Parametern gelieferten Informationen. Die vollst&auml;ndige Klasse sieht danach wie in Listing 3 aus.<\/p>\n<pre>Implements MSXML2.IVBSAXContentHandler\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_characters(strChars<span style=\"color:blue;\"> As String<\/span>)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"characters: \" & strChars\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Property <span style=\"color:blue;\">Set<\/span> <\/span>IVBSAXContentHandler_documentLocator(ByVal RHS<span style=\"color:blue;\"> As <\/span>MSXML2.IVBSAXLocator)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"documentLocator: \" & RHS.columnNumber, RHS.lineNumber, RHS.publicId, _\r\n         RHS.systemId\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_endDocument()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"endDocument\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_endElement(strNamespaceURI<span style=\"color:blue;\"> As String<\/span>, _\r\n         strLocalName<span style=\"color:blue;\"> As String<\/span>, strQName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"endElement: \" & strNamespaceURI, strLocalName, strQName\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_endPrefixMapping(strPrefix<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"endPrefixMapping: \" & strPrefix\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_ignorableWhitespace(strChars<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"ignorableWhitespace: \" & strChars\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_processingInstruction(strTarget<span style=\"color:blue;\"> As String<\/span>, strData<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"processingInstruction: \" & strTarget, strData\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_skippedEntity(strName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"skippedEntity: \" & strName\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_startDocument()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"startDocument\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_startElement(strNamespaceURI<span style=\"color:blue;\"> As String<\/span>, _\r\n         strLocalName<span style=\"color:blue;\"> As String<\/span>, strQName<span style=\"color:blue;\"> As String<\/span>, _\r\n         ByVal oAttributes<span style=\"color:blue;\"> As <\/span>MSXML2.IVBSAXAttributes)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"startElement:\" & strNamespaceURI, strLocalName, strQName  \r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_startPrefixMapping(strPrefix<span style=\"color:blue;\"> As String<\/span>, strURI<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"startPrefixMapping: \" & strPrefix, strURI\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Klasse clsSAX mit einigen Anweisungen zum Ausprobieren der Funktion des Parsers<\/span><\/b><\/p>\n<p><b>Einlesevorgang testen<\/b><\/p>\n<p>Nun l&ouml;sen wir den Einlesevorgang anhand der weiter oben vorgestellten kleinen Beispieldatei aus. Die Ausgabe im Direktbereich des VBA-Editors sieht anschlie&szlig;end wie in Bild 6 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_006.png\" alt=\"Ausgabe des SAX-Parsers f&uuml;r ein XML-Dokument\" width=\"650\" height=\"503,082\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ausgabe des SAX-Parsers f&uuml;r ein XML-Dokument<\/span><\/b><\/p>\n<p>Eigentlich sind alle Ausgaben logisch: <b>documentLocator <\/b>liefert den Pfad des Dokuments, <b>startDocument<\/b>, <b>startElement<\/b>, <b>endElement <\/b>und <b>endDocument <\/b>feuern an den entsprechenden Stellen.<\/p>\n<p>Nur das Ereignis <b>characters <\/b>liefert auf den ersten Blick Informationen, die nicht direkt zu interpretieren sind. Wenn man sich allerdings den Aufbau des XML-Dokuments mit seinen Zeilenumbr&uuml;chen und Einsch&uuml;ben ansieht, wird schnell deutlich, dass der SAX-Parser auch diese interpretiert.<\/p>\n<p>Dem k&ouml;nnen Sie entgegenwirken, indem Sie Leerzeichen und Umbr&uuml;che aus dem XML-Dokument entfernen. Besteht das komplette Dokument nur noch aus einer einzigen Zeile, sieht die Ausgabe wie in Bild 7 aus &#8211; das ist doch schon wesentlich geordneter.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_969_007.png\" alt=\"Ausgabe f&uuml;r ein einfaches XML-Dokument ohne Einsch&uuml;be und Umbr&uuml;che\" width=\"650\" height=\"316,0959\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ausgabe f&uuml;r ein einfaches XML-Dokument ohne Einsch&uuml;be und Umbr&uuml;che<\/span><\/b><\/p>\n<p><b>Attribute einlesen<\/b><\/p>\n<p>Neben den eigentlichen Elementinhalten fehlen noch die Attribute der einzelnen Elemente. Diese werden beispielsweise wie folgt angegeben:<\/p>\n<pre>&lt;Kunde KundeID=\"123\"&gt;...&lt;\/Kunde&gt;<\/pre>\n<p>Auf diese Attribute greifen Sie in der Prozedur <b>IVBSAXContentHandler_startElement <\/b>zu, und zwar mithilfe des Parameters <b>oAttributes<\/b>. Dieses Attribut bietet folgende Eigenschaften, die f&uuml;r uns interessant sind:<\/p>\n<ul>\n<li><b>length<\/b>: Liefert die Anzahl der Attribute des aktuellen Elements.<\/li>\n<li><b>getLocalName(index)<\/b>: Erwartet den Index des betroffenen Attributs (der Index ist 0-basiert) und liefert den im Element angegebenen Attributnamen.<\/li>\n<li><b>getQName(index)<\/b>: Liefert den Namen inklusive Namespace (zum Beispiel <b>xsi:Kunde<\/b>)<\/li>\n<li><b>getValue(index)<\/b>: Liefert den Wert f&uuml;r den gegebenen Index.<\/li>\n<li><b>getType(index)<\/b>: Liefert den Typ des Elements, beispielsweise <b>CDATA<\/b>.<\/li>\n<\/ul>\n<p>Mit diesen Eigenschaften k&ouml;nnen wir, wenn wir das XML-Dokument noch nicht kennen, einfach auf die enthaltenen Attribute und deren Werte zugreifen. Dazu verwenden wir eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Werte von <b>0 <\/b>bis zur mit der Eigenschaft <b>length <\/b>ermittelten Anzahl minus eins. In dieser Schleife lassen wir uns alle Attribute samt Wert und Typ ausgeben. Dazu erweitern wir die Ereignisprozedur <b>IVBSAXContentHandler_startElement<\/b> wie in Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>IVBSAXContentHandler_startElement(strNamespaceURI<span style=\"color:blue;\"> As String<\/span>, _\r\n         strLocalName<span style=\"color:blue;\"> As String<\/span>, strQName<span style=\"color:blue;\"> As String<\/span>, _\r\n         ByVal oAttributes<span style=\"color:blue;\"> As <\/span>MSXML2.IVBSAXAttributes)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"startElement:\" & strNamespaceURI, strLocalName, strQName\r\n     For i = 0 To oAttributes.length - 1\r\n         <span style=\"color:blue;\">With<\/span> oAttributes\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"startElement - Attribut: \" & .getLocalName(i) & \"=\" _\r\n                 & .getValue(i) & \" Type: \" & .getType(i)\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Zugriff auf die Attribute eines XML-Elements<\/span><\/b><\/p>\n<p>Wenn Sie das XML-Dokument und seinen Aufbau kennen, k&ouml;nnen Sie nat&uuml;rlich auch direkt auf die enthaltenen Attribute eines Elements mit einem bestimmten Namen zugreifen.<\/p>\n<p>Dies l&auml;sst sich beispielsweise mit der folgenden <b>Select Case<\/b>-Bedingung pr&uuml;fen:<\/p>\n<pre>Select Case strLocalName\r\n   <span style=\"color:blue;\">Case <\/span>\"Kunde\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"ID: \" _\r\n       & oAttributes. _\r\n       getValueFromName(\"\", \"KundeID\")\r\n<span style=\"color:blue;\">End Select<\/span><\/pre>\n<p>Diese bauen Sie ebenfalls in die Ereignisprozedur <b>IVBSAXContentHandler_startElement <\/b>ein. Sollte nun ein Element namens <b>Kunde <\/b>auftauchen, liest die Prozedur den Wert des Attributs <b>KundeID <\/b>ein.<\/p>\n<p><b>Debuggen nicht in den Ereignissen m&ouml;glich<\/b><\/p>\n<p>Beim Programmieren der SAX-Schnittstelle wird es fr&uuml;her oder sp&auml;ter mal zu einem Fehler kommen. Access meldet den Fehler dann zwar mit einer entsprechenden Meldung, aber wenn Sie dann debuggen wollen, um sich die verantwortliche Anweisung anzusehen, landen Sie immer in der Zeile mit dem Aufruf der Methode <b>parseURL<\/b>.<\/p>\n<p>Sollten Sie also genauer wissen wollen, wo ein solcher Fehler aufgetreten ist, m&uuml;ssen Sie entweder schrittweise durch die Ereignisprozeduren der Klasse <b>clsSAX <\/b>laufen (sehr aufw&auml;ndig!), entsprechende Haltepunkte an den vermuteten Stellen anbringen und diese per <b>F5 <\/b>nacheinander ansteuern oder die Fehlerbehandlung in den betroffenen Ereignisprozeduren deaktivieren und im Falle eines Fehlers eine benutzerdefinierte Fehlermeldung platzieren:<\/p>\n<pre>On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n...\r\n<span style=\"color:blue;\">MsgBox<\/span> Err.Number & \" \" & Err.Description\r\nOn Error Goto 0<\/pre>\n<p>Wenn Sie es direkt genauer wissen m&ouml;chten, f&uuml;gen Sie den Zeilen noch Zeilennummern hinzu (etwa mit MZ-Tools) und lassen die fehlerhafte Zeile mit der nicht dokumentierten Funktion <b>Erl <\/b>ausgeben.<\/p>\n<p><b>Probleme mit Umlauten et cetera<\/b><\/p>\n<p>W&auml;hrend der Entwicklung trat ein interessantes Problem auf, das ich Ihnen &#8211; samt L&ouml;sung &#8211; nicht vorenthalten m&ouml;chte. Es geht dabei um das Einlesen von Umlauten und anderen Sonderzeichen.<\/p>\n<p>Bei einer Testdatei, die ich einfach &uuml;ber den Windows Explorer als Textdatei erstellt und dann als <b>.xml<\/b>-Datei gespeichert habe, meldete der SAX-Parser immer wieder den Fehler <b>Ung&uuml;ltiges XML-Zeichen<\/b>. Interessanterweise geschah das nicht mit einer anderen Datei, die ich im Rahmen eines Webservice-Projekts aus dem Internet geladen hatte. Auch diese enthielt Umlaute sowie andere Sonderzeichen.<\/p>\n<p>Um das Problem einzukreisen, habe ich den kompletten Inhalt der fehlerbehafteten XML-Datei in diejenige eingef&uuml;gt, die keine Probleme verursachte. Das Verr&uuml;ckte war, dass die Webservice-Datei immer noch problemlos eingelesen werden konnte, meine selbst erstellte jedoch nicht.<\/p>\n<p>Schlie&szlig;lich kam ich auf die Idee, die Funktion zum Vergleichen von Dateien des Text-Editors Textpad zu nutzen. Diese offenbarte dann den Unterschied, der wie folgt aussah:<\/p>\n<pre>4,5c4,5\r\n&lt;     &lt;Vorname&gt;Andr&eacute;&lt;\/Vorname&gt;\r\n---\r\n&gt;     &lt;Vorname&gt;Andr&Atilde;&copy;&lt;\/Vorname&gt;<\/pre>\n<p>Der Text-Editor zeigte zwar f&uuml;r beide Dateien das Zeichen <b>&eacute; <\/b>an, aber in einem Fall war es offensichtlich in einer anderen Codierung gespeichert. Der <b>Datei speichern<\/b>-Dialog von Textpad lieferte schlie&szlig;lich die L&ouml;sung: Die Datei, die der Webservice geliefert hat, lag im Zeichensatz <b>UTF-8 <\/b>vor, die unter Windows selbst erstellte im Zeichensatz <b>ANSI<\/b>. Das Speichern der selbst erstellten Datei im Format <b>UTF-8 <\/b>sorgte schlie&szlig;lich daf&uuml;r, dass ich die Datei fehlerfrei einlesen konnte.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag hat die Grundlagen f&uuml;r die Verwendung des SAX-Parsers zum Einlesen von XML-Dokumenten erl&auml;utert. Sie k&ouml;nnen damit nun nacheinander auf alle Elemente und Attribute sowie deren Inhalte zugreifen und diese weiterverarbeiten. In diesem Fall haben wir die Daten einfach in das Direktfenster des VBA-Editors geschrieben.<\/p>\n<p>In der Praxis werden Sie den SAX-Parser statt des DOM-Parsers verwenden, wenn die zu untersuchenden Dateien sehr gro&szlig; sind &#8211; so gro&szlig;, dass das Einlesen mit DOM entweder sehr lange dauern w&uuml;rde oder die Datei erst gar nicht ge&ouml;ffnet werden kann, weil sie zu gro&szlig; ist, um sie in den Arbeitsspeicher zu laden und zu verarbeiten. Bedenken Sie, dass dazu weit mehr Speicherplatz erforderlich ist als die XML-Datei allein einnimmt.<\/p>\n<p>In einem weiteren Beitrag schauen wir uns den Einsatz des SAX-Parsers an konkreten Beispielen an. Das bedeutet, dass wir die Daten aus XML-Dateien auslesen und direkt in entsprechende Access-Tabellen schreiben werden. Der Beitrag hei&szlig;t <b>SAX: XML-Dokumente einlesen in der Praxis <\/b>(<b>www.access-im-unternehmen.de\/970<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SAX.mdb<\/p>\n<p>Kunde.xml<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{DCAF485E-8346-4FC1-AD65-B54045E78269}\/aiu_969.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir haben uns bereits in vielen Beitr&auml;gen mit dem Parsen von XML-Dokumenten befasst. Dabei haben wir immer den DOM-Parser verwendet, um die im XML-Dokument enthaltenen Daten zu lesen. In diesem Beitrag schauen wir uns eine Alternative namens SAX an. W&auml;hrend DOM das komplette XML-Dokument in den Speicher liest und darauf zugreift, liest SAX das Dokument zeilenweise ein. Im Folgenden erfahren Sie, welche Vor- und Nachteile die beiden Methoden haben und wie Sie mit SAX arbeiten k&ouml;nnen.<\/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":[66012015,662015,44000026],"tags":[],"class_list":["post-55000969","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","category-Interaktiv"],"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>XML-Dokumente mit SAX parsen - Access im Unternehmen<\/title>\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\/XMLDokumente_mit_SAX_parsen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XML-Dokumente mit SAX parsen\" \/>\n<meta property=\"og:description\" content=\"Wir haben uns bereits in vielen Beitr&auml;gen mit dem Parsen von XML-Dokumenten befasst. Dabei haben wir immer den DOM-Parser verwendet, um die im XML-Dokument enthaltenen Daten zu lesen. In diesem Beitrag schauen wir uns eine Alternative namens SAX an. W&auml;hrend DOM das komplette XML-Dokument in den Speicher liest und darauf zugreift, liest SAX das Dokument zeilenweise ein. Im Folgenden erfahren Sie, welche Vor- und Nachteile die beiden Methoden haben und wie Sie mit SAX arbeiten k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:06:49+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d\" \/>\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=\"13\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"XML-Dokumente mit SAX parsen\",\"datePublished\":\"2020-05-22T21:06:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/\"},\"wordCount\":2198,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/db6865ed4e1947fda0635e194a683d1d\",\"articleSection\":[\"1\\\/2015\",\"2015\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/\",\"name\":\"XML-Dokumente mit SAX parsen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/db6865ed4e1947fda0635e194a683d1d\",\"datePublished\":\"2020-05-22T21:06:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/db6865ed4e1947fda0635e194a683d1d\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/db6865ed4e1947fda0635e194a683d1d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLDokumente_mit_SAX_parsen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XML-Dokumente mit SAX parsen\"}]},{\"@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":"XML-Dokumente mit SAX parsen - Access im Unternehmen","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\/XMLDokumente_mit_SAX_parsen\/","og_locale":"de_DE","og_type":"article","og_title":"XML-Dokumente mit SAX parsen","og_description":"Wir haben uns bereits in vielen Beitr&auml;gen mit dem Parsen von XML-Dokumenten befasst. Dabei haben wir immer den DOM-Parser verwendet, um die im XML-Dokument enthaltenen Daten zu lesen. In diesem Beitrag schauen wir uns eine Alternative namens SAX an. W&auml;hrend DOM das komplette XML-Dokument in den Speicher liest und darauf zugreift, liest SAX das Dokument zeilenweise ein. Im Folgenden erfahren Sie, welche Vor- und Nachteile die beiden Methoden haben und wie Sie mit SAX arbeiten k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:06:49+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"XML-Dokumente mit SAX parsen","datePublished":"2020-05-22T21:06:49+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/"},"wordCount":2198,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d","articleSection":["1\/2015","2015","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/","url":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/","name":"XML-Dokumente mit SAX parsen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d","datePublished":"2020-05-22T21:06:49+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/db6865ed4e1947fda0635e194a683d1d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/XMLDokumente_mit_SAX_parsen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"XML-Dokumente mit SAX parsen"}]},{"@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\/55000969","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=55000969"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000969\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}